diff options
Diffstat (limited to 'tests/auto/core/nodes/tst_nodes.cpp')
-rw-r--r-- | tests/auto/core/nodes/tst_nodes.cpp | 726 |
1 files changed, 142 insertions, 584 deletions
diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp index c39638754..39560938a 100644 --- a/tests/auto/core/nodes/tst_nodes.cpp +++ b/tests/auto/core/nodes/tst_nodes.cpp @@ -26,10 +26,6 @@ ** ****************************************************************************/ -// TODO Remove in Qt6 -#include <QtCore/qcompilerdetection.h> -QT_WARNING_DISABLE_DEPRECATED - #include <QtTest/QTest> #include <Qt3DCore/qnode.h> #include <Qt3DCore/qentity.h> @@ -37,22 +33,14 @@ QT_WARNING_DISABLE_DEPRECATED #include <Qt3DCore/qaspectengine.h> #include <Qt3DCore/qabstractaspect.h> #include <Qt3DCore/private/qscene_p.h> -#include <Qt3DCore/qcomponentaddedchange.h> -#include <Qt3DCore/qcomponentremovedchange.h> -#include <Qt3DCore/qnodedestroyedchange.h> -#include <Qt3DCore/qpropertynodeaddedchange.h> -#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> -#include <Qt3DCore/private/qlockableobserverinterface_p.h> #include <Qt3DCore/private/qnode_p.h> #include <Qt3DCore/private/qcomponent_p.h> #include <QSignalSpy> -#include "testpostmanarbiter.h" +#include <testarbiter.h> class tst_Nodes : public QObject { @@ -110,7 +98,6 @@ private slots: void checkDefaultConstruction(); void checkPropertyChanges(); - void checkCreationData(); void checkEnabledUpdate(); void checkPropertyTrackModeUpdate(); void checkTrackedPropertyNamesUpdate(); @@ -118,100 +105,6 @@ private slots: void checkNodeRemovedFromDirtyListOnDestruction(); }; -class ObserverSpy; -class SimplePostman : public Qt3DCore::QAbstractPostman -{ -public: - SimplePostman(ObserverSpy *spy) - : m_spy(spy) - {} - - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &) final {} - void setScene(Qt3DCore::QScene *) final {} - void notifyBackend(const Qt3DCore::QSceneChangePtr &change) final; - bool shouldNotifyFrontend(const Qt3DCore::QSceneChangePtr &changee) final { Q_UNUSED(changee); return false; } - -private: - ObserverSpy *m_spy; -}; - -class ObserverSpy : public Qt3DCore::QAbstractArbiter -{ -public: - class ChangeRecord : public QPair<Qt3DCore::QSceneChangePtr, bool> - { - public: - ChangeRecord(const Qt3DCore::QSceneChangePtr &event, bool locked) - : QPair<Qt3DCore::QSceneChangePtr, bool>(event, locked) - {} - - Qt3DCore::QSceneChangePtr change() const { return first; } - - bool wasLocked() const { return second; } - }; - - ObserverSpy() - : Qt3DCore::QAbstractArbiter() - , m_postman(new SimplePostman(this)) - { - } - - ~ObserverSpy(); - - void sceneChangeEventWithLock(const Qt3DCore::QSceneChangePtr &e) override - { - events << ChangeRecord(e, true); - } - - void sceneChangeEventWithLock(const Qt3DCore::QSceneChangeList &e) override - { - for (size_t i = 0, m = e.size(); i < m; ++i) { - events << ChangeRecord(e.at(i), false); - } - } - - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override - { - events << ChangeRecord(e, false); - } - - Qt3DCore::QAbstractPostman *postman() const final - { - return m_postman.data(); - } - - void addDirtyFrontEndNode(Qt3DCore::QNode *node) final { - if (!dirtyNodes.contains(node)) - dirtyNodes << node; - } - - void addDirtyFrontEndNode(Qt3DCore::QNode *node, Qt3DCore::QNode *subNode, const char *property, Qt3DCore::ChangeFlag change) final { - if (!dirtyNodes.contains(node)) - dirtyNodes << node; - dirtySubNodes.push_back({node, subNode, change, property}); - } - - void removeDirtyFrontEndNode(Qt3DCore::QNode *node) final { - dirtyNodes.removeOne(node); - } - - QVector<Qt3DCore::QNode *> dirtyNodes; - QVector<Qt3DCore::NodeRelationshipChange> dirtySubNodes; - QList<ChangeRecord> events; - QScopedPointer<SimplePostman> m_postman; -}; - -ObserverSpy::~ObserverSpy() -{ -} - -void SimplePostman::notifyBackend(const Qt3DCore::QSceneChangePtr &change) -{ - m_spy->sceneChangeEventWithLock(change); -} - - - class MyQNode : public Qt3DCore::QNode { Q_OBJECT @@ -241,7 +134,7 @@ public: return m_customProperty; } - void setArbiterAndScene(Qt3DCore::QAbstractArbiter *arbiter, + void setArbiterAndScene(Qt3DCore::QChangeArbiter *arbiter, Qt3DCore::QScene *scene = nullptr) { Q_ASSERT(arbiter); @@ -296,14 +189,14 @@ public slots: if (!attribute->parent()) attribute->setParent(this); - d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueAdded); + d->update(); } } void removeAttribute(MyQNode *attribute) { Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(this); - d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueRemoved); + d->update(); m_attributes.removeOne(attribute); // Remove bookkeeping connection @@ -333,7 +226,7 @@ public: { } - void setArbiterAndScene(Qt3DCore::QAbstractArbiter *arbiter, + void setArbiterAndScene(Qt3DCore::QChangeArbiter *arbiter, Qt3DCore::QScene *scene = nullptr) { Q_ASSERT(arbiter); @@ -343,7 +236,7 @@ public: Qt3DCore::QNodePrivate::get(this)->setArbiter(arbiter); } - void setArbiterAndEngine(Qt3DCore::QAbstractArbiter *arbiter, + void setArbiterAndEngine(Qt3DCore::QChangeArbiter *arbiter, Qt3DCore::QAspectEngine *engine) { Q_ASSERT(arbiter); @@ -383,7 +276,7 @@ public: if (!attribute->parent()) attribute->setParent(this); - d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueRemoved); + d->update(); } } @@ -423,7 +316,7 @@ class MyQComponent : public Qt3DCore::QComponent public: explicit MyQComponent(Qt3DCore::QNode *parent = nullptr) : QComponent(parent) {} - void setArbiter(Qt3DCore::QAbstractArbiter *arbiter) + void setArbiter(Qt3DCore::QChangeArbiter *arbiter) { Q_ASSERT(arbiter); Qt3DCore::QComponentPrivate::get(this)->setArbiter(arbiter); @@ -442,7 +335,7 @@ public: { } - void setArbiter(Qt3DCore::QAbstractArbiter *arbiter) + void setArbiter(Qt3DCore::QChangeArbiter *arbiter) { Q_ASSERT(arbiter); Qt3DCore::QComponentPrivate::get(this)->setArbiter(arbiter); @@ -501,11 +394,11 @@ class TestFunctor : public Qt3DCore::QBackendNodeMapper public: TestFunctor(TestAspect *aspect) : m_aspect(aspect) {} - Qt3DCore::QBackendNode *create(const Qt3DCore::QNodeCreatedChangeBasePtr &change) const override + Qt3DCore::QBackendNode *create(Qt3DCore::QNodeId id) const override { auto node = new Qt3DCore::QBackendNode; - m_Nodes.insert(change->subjectId(), node); - m_aspect->addEvent(change->subjectId(), TestAspect::Creation); + m_Nodes.insert(id, node); + m_aspect->addEvent(id, TestAspect::Creation); return node; } @@ -545,10 +438,10 @@ public: TestAspect::TestAspect(QObject *parent) : TestAspect(*new TestAspectPrivate, parent) { - registerBackendType<Qt3DCore::QEntity, true>(QSharedPointer<TestFunctor>::create(this)); - registerBackendType<MyQEntity, true>(QSharedPointer<TestFunctor>::create(this)); - registerBackendType<MyQNode, true>(QSharedPointer<TestFunctor>::create(this)); - registerBackendType<Qt3DCore::QNode, true>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<Qt3DCore::QEntity>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<MyQEntity>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<MyQNode>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<Qt3DCore::QNode>(QSharedPointer<TestFunctor>::create(this)); } TestAspect::TestAspect(TestAspectPrivate &dd, QObject *parent) @@ -625,9 +518,9 @@ void tst_Nodes::appendSingleChildNodeToNodeNoSceneExplicitParenting() { // Check nodes added when no scene is set // GIVEN - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> node(new MyQNode()); - node->setArbiterAndScene(&spy); + node->setArbiterAndScene(&arbiter); // THEN QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() == nullptr); @@ -646,16 +539,16 @@ void tst_Nodes::appendSingleChildNodeToNodeNoSceneExplicitParenting() QCOMPARE(node->children().count(), 1); // Events are only sent when a scene is set on the root node - QCOMPARE(spy.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } void tst_Nodes::appendSingleChildNodeToNodeNoSceneImplicitParenting() { // Check nodes added when no scene is set // GIVEN - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> node(new MyQNode()); - node->setArbiterAndScene(&spy); + node->setArbiterAndScene(&arbiter); // THEN QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() == nullptr); @@ -669,16 +562,16 @@ void tst_Nodes::appendSingleChildNodeToNodeNoSceneImplicitParenting() QCOMPARE(node->children().count(), 1); // Events are only sent when a scene is set on the root node - QCOMPARE(spy.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } void tst_Nodes::appendMultipleChildNodesToNodeNoScene() { // Check multiple nodes added with no scene set // GIVEN - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> node(new MyQNode()); - node->setArbiterAndScene(&spy); + node->setArbiterAndScene(&arbiter); // THEN QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() == nullptr); @@ -701,7 +594,7 @@ void tst_Nodes::appendMultipleChildNodesToNodeNoScene() QCOMPARE(node->children().count(), 10); // Events are only sent when a scene is set on the root node - QCOMPARE(spy.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } void tst_Nodes::appendSingleChildNodeToNodeSceneExplicitParenting() @@ -709,10 +602,10 @@ void tst_Nodes::appendSingleChildNodeToNodeSceneExplicitParenting() // Check nodes added when scene is set // GIVEN Qt3DCore::QScene scene; - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> node(new MyQNode()); // WHEN - node->setArbiterAndScene(&spy, &scene); + node->setArbiterAndScene(&arbiter, &scene); node->setSimulateBackendCreated(true); // THEN @@ -731,17 +624,9 @@ void tst_Nodes::appendSingleChildNodeToNodeSceneExplicitParenting() // THEN QVERIFY(child->parent() == node.data()); QVERIFY(child->parentNode() == node.data()); - QCOMPARE(spy.events.size(), 1); // Child Added + QCOMPARE(arbiter.dirtyNodes().size(), 1); // Child Added QCOMPARE(node->children().count(), 1); QVERIFY(Qt3DCore::QNodePrivate::get(child.data())->scene() != nullptr); - - // Node Added event - QVERIFY(spy.events.first().wasLocked()); - Qt3DCore::QPropertyNodeAddedChangePtr additionEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(additionEvent); - QCOMPARE(additionEvent->subjectId(), node->id()); - QCOMPARE(additionEvent->addedNodeId(), child->id()); - QCOMPARE(additionEvent->metaObject(), child->metaObject()); } void tst_Nodes::appendSingleChildNodeToNodeSceneImplicitParenting() @@ -749,11 +634,11 @@ void tst_Nodes::appendSingleChildNodeToNodeSceneImplicitParenting() // Check nodes added when scene is set // GIVEN Qt3DCore::QScene scene; - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> node(new MyQNode()); // WHEN - node->setArbiterAndScene(&spy, &scene); + node->setArbiterAndScene(&arbiter, &scene); // THEN QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() != nullptr); @@ -766,17 +651,8 @@ void tst_Nodes::appendSingleChildNodeToNodeSceneImplicitParenting() QVERIFY(child->parentNode() == node.data()); QVERIFY(Qt3DCore::QNodePrivate::get(child.data())->scene() != nullptr); - QCOMPARE(spy.events.size(), 1); - QVERIFY(spy.events.first().wasLocked()); + QCOMPARE(arbiter.dirtyNodes().size(), 1); QCOMPARE(node->children().count(), 1); - - // Node Added event - QVERIFY(spy.events.first().wasLocked()); - Qt3DCore::QPropertyNodeAddedChangePtr additionEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(additionEvent); - QCOMPARE(additionEvent->subjectId(), node->id()); - QCOMPARE(additionEvent->addedNodeId(), child->id()); - QCOMPARE(additionEvent->metaObject(), child->metaObject()); } void tst_Nodes::appendMultipleChildNodesToNodeScene() @@ -785,11 +661,11 @@ void tst_Nodes::appendMultipleChildNodesToNodeScene() // GIVEN Qt3DCore::QScene scene; - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> node(new MyQNode()); // WHEN - node->setArbiterAndScene(&spy, &scene); + node->setArbiterAndScene(&arbiter, &scene); node->setSimulateBackendCreated(true); // THEN QVERIFY(Qt3DCore::QNodePrivate::get(node.data())->scene() != nullptr); @@ -816,89 +692,53 @@ void tst_Nodes::appendMultipleChildNodesToNodeScene() // WHEN QCoreApplication::processEvents(); - // THEN backend is notified after the event loop spins. The recorded events are a little - // tricky to understand and differs for children with the parent being set at construction - // time (even children and ids) and the children being created without a parent and then - // explicitly calling setParent() after (odd children and ids). - // - // Even children: - // child constructed - // notifications to backend scheduled via the event loop as object is not yet fully constructed - // - // Odd children: - // child constructed - // parent set - // notifications to backend sent immediately as object is fully constructed - // - // With this in mind, the recorded events should show: - // - // for each odd child: - // child addition to parent of odd child - // - // followed by: - // - // for each even child: - // child addition to parent of even child - // - const auto expectedEventCount = childCount; - QCOMPARE(spy.events.size(), 10); - - for (auto i = 0; i < expectedEventCount; ++i) { - const auto childIndex = i; - Qt3DCore::QNode *child = node->childNodes().at(childIndex); - - const auto recordIndex = (i % 2 == 0) ? expectedEventCount / 2 + i / 2 : i / 2; - const auto additionRecord = spy.events.at(recordIndex); - Qt3DCore::QPropertyNodeAddedChangePtr additionEvent = additionRecord.change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(additionEvent->subjectId(), node->id()); - QCOMPARE(additionEvent->addedNodeId(), child->id()); - QCOMPARE(additionEvent->metaObject(), child->metaObject()); - } + // THEN backend is notified after the event loop spins. Only the parent is notified + QCOMPARE(arbiter.dirtyNodes().size(), 1); } void tst_Nodes::checkParentChangeToNull() { // GIVEN Qt3DCore::QScene scene; - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> root(new MyQNode()); // WHEN - root->setArbiterAndScene(&spy, &scene); + root->setArbiterAndScene(&arbiter, &scene); QScopedPointer<Qt3DCore::QNode> child(new MyQNode(root.data())); QCoreApplication::processEvents(); // THEN QVERIFY(child->parent() == root.data()); - QCOMPARE(spy.events.size(), 1); + QCOMPARE(arbiter.dirtyNodes().size(), 1); QCOMPARE(root->children().size(), 1); // WHEN - spy.events.clear(); + arbiter.clear(); child->setParent(Q_NODE_NULLPTR); // THEN QVERIFY(child->parent() == nullptr); QCOMPARE(root->children().size(), 0); - QCOMPARE(spy.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } void tst_Nodes::checkParentChangeToOtherParent() { // GIVEN Qt3DCore::QScene scene; - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> root(new MyQNode()); - root->setArbiterAndScene(&spy, &scene); + root->setArbiterAndScene(&arbiter, &scene); QScopedPointer<MyQNode> parent1(new MyQNode(root.data())); QScopedPointer<MyQNode> parent2(new MyQNode(root.data())); QCoreApplication::processEvents(); // THEN - QCOMPARE(spy.events.size(), 2); // 2 x (1 node added to children change) + QCOMPARE(arbiter.dirtyNodes().size(), 1); // only parent node has changed // WHEN - spy.events.clear(); + arbiter.clear(); QScopedPointer<Qt3DCore::QNode> child(new MyQNode(parent1.data())); QCoreApplication::processEvents(); @@ -907,48 +747,32 @@ void tst_Nodes::checkParentChangeToOtherParent() QCOMPARE(parent1->children().size(), 1); QCOMPARE(parent2->children().size(), 0); QVERIFY(Qt3DCore::QNodePrivate::get(child.data())->scene() != nullptr); - QCOMPARE(spy.events.size(), 1); // 1 node added to children change + QCOMPARE(arbiter.dirtyNodes().size(), 1); // 1 node added to children change // WHEN - spy.events.clear(); + arbiter.clear(); child->setParent(parent2.data()); // THEN QVERIFY(child->parent() == parent2.data()); QCOMPARE(parent1->children().size(), 0); QCOMPARE(parent2->children().size(), 1); - QCOMPARE(spy.events.size(), 1); + QCOMPARE(arbiter.dirtyNodes().size(), 1); // CHECK event 1 is a Node Removed event // this no longer generated because nodes don't have backends yet QVERIFY(!Qt3DCore::QNodePrivate::get(child.data())->m_hasBackendNode); - - -// QVERIFY(spy.events.first().wasLocked()); -// const Qt3DCore::QPropertyNodeRemovedChangePtr event = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>(); -// QCOMPARE(event->type(), Qt3DCore::PropertyValueRemoved); -// QCOMPARE(event->subjectId(), parent1->id()); -// QCOMPARE(event->removedNodeId(), child->id()); -// QCOMPARE(event->metaObject(), child->metaObject()); - - // CHECK event 2 is a Node Added event - QVERIFY(spy.events.last().wasLocked()); - const Qt3DCore::QPropertyNodeAddedChangePtr event2 = spy.events.last().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event2->subjectId(), parent2->id()); - QCOMPARE(event2->addedNodeId(), child->id()); - QCOMPARE(event2->metaObject(), child->metaObject()); } void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; engine.setRunMode(Qt3DCore::QAspectEngine::Manual); QScopedPointer<MyQEntity> root(new MyQEntity()); - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); auto aspect = new TestAspect; engine.registerAspect(aspect); @@ -967,11 +791,11 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() QCOMPARE(aspect->events[1].nodeId, child2->id()); // THEN - QCOMPARE(spy.events.size(), 2); // 2 x (1 child added to parent change) + QCOMPARE(arbiter.dirtyNodes().size(), 1); // only parent node has changed // WHEN -> Reparenting child with backend node to new parent with no backend yet aspect->clearNodes(); - spy.events.clear(); + arbiter.clear(); QScopedPointer<Qt3DCore::QNode> newParent(new MyQNode(root.data())); child->setParent(newParent.data()); @@ -990,62 +814,17 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() engine.processFrame(); // THEN - QCOMPARE(spy.events.size(), 2); - // 1 node removed change - // 1 node added to children change + QCOMPARE(arbiter.dirtyNodes().size(), 1); // only parent node has changed QVERIFY(Qt3DCore::QNodePrivate::get(newParent.data())->m_hasBackendNode == true); QVERIFY(Qt3DCore::QNodePrivate::get(child)->m_hasBackendNode == true); - { - // CHECK event 1 is a Node Removed event - QVERIFY(spy.events.first().wasLocked()); - const Qt3DCore::QPropertyNodeRemovedChangePtr event = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(event->type(), Qt3DCore::PropertyValueRemoved); - QCOMPARE(event->subjectId(), root->id()); - QCOMPARE(event->removedNodeId(), child->id()); - QCOMPARE(event->metaObject(), child->metaObject()); - - const Qt3DCore::QPropertyNodeAddedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event2->addedNodeId(), newParent->id()); - QCOMPARE(event2->metaObject(), newParent->metaObject()); - QCOMPARE(event2->subjectId(), root->id()); - - QCOMPARE(aspect->events.count(), 3); - - // child backend is destroyed because it was reparented to node without backend (newParent) - QCOMPARE(aspect->events[0].type, TestAspect::Destruction); - QCOMPARE(aspect->events[0].nodeId, child->id()); - - // newParent and child both get backends created - QCOMPARE(aspect->events[1].type, TestAspect::Creation); - QCOMPARE(aspect->events[1].nodeId, newParent->id()); - QCOMPARE(aspect->events[2].type, TestAspect::Creation); - QCOMPARE(aspect->events[2].nodeId, child->id()); - } - // WHEN -> Changing parent to node with existing backend aspect->clearNodes(); child->setParent(child2); // THEN - QCOMPARE(spy.events.size(), 2); - - // 1 node removed change, 1 node added change - { - QVERIFY(spy.events.first().wasLocked()); - const Qt3DCore::QPropertyNodeRemovedChangePtr event = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(event->type(), Qt3DCore::PropertyValueRemoved); - QCOMPARE(event->subjectId(), newParent->id()); - QCOMPARE(event->removedNodeId(), child->id()); - QCOMPARE(event->metaObject(), child->metaObject()); - - const Qt3DCore::QPropertyNodeAddedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event2->addedNodeId(), child->id()); - QCOMPARE(event2->metaObject(), child->metaObject()); - QCOMPARE(event2->subjectId(), child2->id()); - } + QCOMPARE(arbiter.dirtyNodes().size(), 3); // old parent, new parent, and child have all changed + arbiter.clear(); QVERIFY(Qt3DCore::QNodePrivate::get(child)->m_hasBackendNode == true); QCOMPARE(root->childNodes().size(), 2); @@ -1067,28 +846,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() engine.processFrame(); // THEN - QCOMPARE(spy.events.size(), 2); - // 1 node removed change - // 1 node added to children change - { - // CHECK event 1 is a Node Removed event - QVERIFY(spy.events.first().wasLocked()); - const Qt3DCore::QPropertyNodeRemovedChangePtr event = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(event->type(), Qt3DCore::PropertyValueRemoved); - QCOMPARE(event->subjectId(), child2->id()); - QCOMPARE(event->removedNodeId(), child->id()); - QCOMPARE(event->metaObject(), child->metaObject()); - - const Qt3DCore::QPropertyNodeAddedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event2->addedNodeId(), newParent2->id()); - QCOMPARE(event2->metaObject(), newParent2->metaObject()); - QCOMPARE(event2->subjectId(), root->id()); - - // child backend is destroyed because it was reparented to node without backend (newParent) - QCOMPARE(aspect->events[0].type, TestAspect::Destruction); - QCOMPARE(aspect->events[0].nodeId, child->id()); - } + QCOMPARE(arbiter.dirtyNodes().size(), 2); } //Test creation changes happen for an entire subtree at once, starting at the top @@ -1097,13 +855,13 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent() void tst_Nodes::checkBackendNodesCreatedFromTopDown() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; auto aspect = new TestAspect; engine.registerAspect(aspect); QScopedPointer<MyQEntity> root(new MyQEntity()); - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); QScopedPointer<Qt3DCore::QNode> parentWithBackend(new MyQNode(root.data())); // create parent backend node @@ -1112,14 +870,14 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDown() // WHEN -> creating 3 nodes and setting one as a property on the other // child2 is set as property on child1, but is created AFTER child1 - spy.events.clear(); + arbiter.clear(); MyQNode *dummyParent(new MyQNode(parentWithBackend.data())); MyQNode *child1(new MyQNode(parentWithBackend.data())); MyQNode *child2(new MyQNode(dummyParent)); child1->setNodeProperty(child2); // THEN - we should have no events because the new nodes have no backend yet - QCOMPARE(spy.events.count(), 0); + QCOMPARE(arbiter.dirtyNodes().count(), 0); // WHEN - create the backend nodes QCoreApplication::processEvents(); @@ -1130,27 +888,13 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDown() QVERIFY(child2->parent() == dummyParent); // THEN - QCOMPARE(spy.events.size(), 2); - // 1 node added to children change (dummyParent to parent) - // 1 node added to children change (child1 to parent) + QCOMPARE(arbiter.dirtyNodes().size(), 1); // only parent node has changed { QVERIFY(Qt3DCore::QNodePrivate::get(dummyParent)->m_hasBackendNode); QVERIFY(Qt3DCore::QNodePrivate::get(child1)->m_hasBackendNode); QVERIFY(Qt3DCore::QNodePrivate::get(child2)->m_hasBackendNode); - // 1st event: dummyParent added to parent - const auto event = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event->addedNodeId(), dummyParent->id()); - QCOMPARE(event->subjectId(), parentWithBackend->id()); - - // 2nd event: child 1 added to parent - const auto event2 = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(event2->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event2->addedNodeId(), child1->id()); - QCOMPARE(event2->subjectId(), parentWithBackend->id()); - verifyChildrenCreatedBeforeParents(root.get(), aspect); } @@ -1159,13 +903,13 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDown() void tst_Nodes::checkBackendNodesCreatedFromTopDownWithReparenting() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; auto aspect = new TestAspect; engine.registerAspect(aspect); QScopedPointer<MyQEntity> root(new MyQEntity()); - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); QScopedPointer<Qt3DCore::QNode> parentWithBackend(new MyQNode(root.data())); // create parent backend node @@ -1175,7 +919,7 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDownWithReparenting() // WHEN -> creating a node with a parent with backend, then reparenting it to another // parent with backend created after it. - spy.events.clear(); + arbiter.clear(); auto node1 = new MyQNode(parentWithBackend.data()); auto parent1 = new MyQNode(parentWithBackend.data()); node1->setParent(parent1); @@ -1205,18 +949,18 @@ void tst_Nodes::checkBackendNodesCreatedFromTopDownWithReparenting() void tst_Nodes::removingSingleChildNodeFromNode() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; QScopedPointer<MyQEntity> root(new MyQEntity()); QScopedPointer<Qt3DCore::QNode> child(new MyQNode()); // WHEN - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); root->setSimulateBackendCreated(true); child->setParent(root.data()); // Clear any creation event - spy.events.clear(); + arbiter.clear(); // THEN QVERIFY(root->children().count() == 1); @@ -1229,26 +973,20 @@ void tst_Nodes::removingSingleChildNodeFromNode() QVERIFY(child->parent() == nullptr); QVERIFY(root->children().count() == 0); - QCOMPARE(spy.events.size(), 1); - - QVERIFY(spy.events.first().wasLocked()); - const Qt3DCore::QPropertyNodeRemovedChangePtr removalEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(removalEvent->subjectId(), root->id()); - QCOMPARE(removalEvent->removedNodeId(), child->id()); - QCOMPARE(removalEvent->metaObject(), child->metaObject()); + QCOMPARE(arbiter.dirtyNodes().size(), 1); } void tst_Nodes::checkAllBackendCreationDoneInSingleFrame() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; engine.setRunMode(Qt3DCore::QAspectEngine::Manual); auto aspect = new TestAspect; engine.registerAspect(aspect); QScopedPointer<MyQEntity> root(new MyQEntity()); - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); QCoreApplication::processEvents(); @@ -1289,12 +1027,12 @@ void tst_Nodes::checkAllBackendCreationDoneInSingleFrame() void tst_Nodes::removingMultipleChildNodesFromNode() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; QScopedPointer<MyQEntity> root(new MyQEntity()); // WHEN - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); // THEN QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->scene() != nullptr); @@ -1310,26 +1048,16 @@ void tst_Nodes::removingMultipleChildNodesFromNode() // THEN QCOMPARE(root->children().count(), 10); - QCOMPARE(spy.events.size(), 10); + QCOMPARE(arbiter.dirtyNodes().size(), 1); // WHEN - spy.events.clear(); + arbiter.clear(); auto cl = root->children(); qDeleteAll(cl); // THEN QVERIFY(root->children().count() == 0); - QCOMPARE(spy.events.size(), 10); - int i = 0; - for (const ObserverSpy::ChangeRecord &r : qAsConst(spy.events)) { - QVERIFY(r.wasLocked()); - const Qt3DCore::QNodeId childId = childIds.at(i); - Qt3DCore::QPropertyNodeRemovedChangePtr additionEvent = r.change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(additionEvent->subjectId(), root->id()); - QCOMPARE(additionEvent->removedNodeId(), childId); - QCOMPARE(additionEvent->metaObject(), &MyQNode::staticMetaObject); - ++i; - } + QCOMPARE(arbiter.dirtyNodes().size(), 0); // since all nodes are deleted, there's no backend to notify } void tst_Nodes::appendingChildEntitiesToNode() @@ -1373,14 +1101,14 @@ void tst_Nodes::removingChildEntitiesFromNode() void tst_Nodes::checkConstructionSetParentMix() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; auto aspect = new TestAspect; engine.registerAspect(aspect); QScopedPointer<MyQEntity> root(new MyQEntity()); // WHEN - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); root->setSimulateBackendCreated(true); // THEN @@ -1398,27 +1126,21 @@ void tst_Nodes::checkConstructionSetParentMix() QCoreApplication::processEvents(); QCOMPARE(root->children().count(), 1); QCOMPARE(subTreeRoot->children().count(), 100); - QCOMPARE(spy.events.size(), 1); // 1 child added (subTree to root) + QCOMPARE(arbiter.dirtyNodes().size(), 1); // 1 child added (subTree to root) // Ensure first event is subTreeRoot verifyChildrenCreatedBeforeParents(root.data(), aspect); - - const Qt3DCore::QPropertyNodeAddedChangePtr lastEvent = spy.events.takeLast().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(!lastEvent.isNull()); - QCOMPARE(lastEvent->subjectId(), root->id()); - QCOMPARE(lastEvent->propertyName(), "children"); - QCOMPARE(lastEvent->addedNodeId(), subTreeRoot->id()); } void tst_Nodes::checkParentingQEntityToQNode() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; QScopedPointer<MyQEntity> root(new MyQEntity()); // WHEN - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); root->setSimulateBackendCreated(true); // THEN @@ -1431,7 +1153,7 @@ void tst_Nodes::checkParentingQEntityToQNode() // THEN QCoreApplication::processEvents(); - QCOMPARE(spy.events.size(), 1); + QCOMPARE(arbiter.dirtyNodes().size(), 1); QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->m_hasBackendNode); QVERIFY(Qt3DCore::QNodePrivate::get(subTreeRoot)->m_hasBackendNode); @@ -1439,43 +1161,23 @@ void tst_Nodes::checkParentingQEntityToQNode() QVERIFY(Qt3DCore::QNodePrivate::get(childNode)->m_hasBackendNode); // WHEN we reparent the childEntity to the childNode (QNode) - spy.events.clear(); + arbiter.clear(); childEntity->setParent(childNode); QCoreApplication::processEvents(); - // THEN we should get - // - one child removed change for childEntity->subTreeRoot, - // - one child added change for childEntity->childNode, - QCOMPARE(spy.events.size(), 2); - - const auto removedEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QVERIFY(!removedEvent.isNull()); - QCOMPARE(removedEvent->subjectId(), subTreeRoot->id()); - - const auto addedEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(!addedEvent.isNull()); - QCOMPARE(addedEvent->subjectId(), childNode->id()); - - // The arbiter's dirtyNodes should contain the childEntity and - // - the dirty node's parent should be childNode - // - the dirty node's parent entity should be the subTreeRoot - QCOMPARE(spy.dirtyNodes.size(), 1); - const auto dirtyEntity = qobject_cast<Qt3DCore::QEntity*>(spy.dirtyNodes.takeFirst()); - QVERIFY(dirtyEntity); - QCOMPARE(dirtyEntity, childEntity); - QCOMPARE(dirtyEntity->parent(), childNode); - QCOMPARE(dirtyEntity->parentEntity(), subTreeRoot); + // THEN + QCOMPARE(arbiter.dirtyNodes().size(), 3); } void tst_Nodes::checkConstructionWithParent() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; QScopedPointer<MyQEntity> root(new MyQEntity()); // WHEN - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); root->setSimulateBackendCreated(true); // THEN @@ -1488,29 +1190,19 @@ void tst_Nodes::checkConstructionWithParent() // THEN we should get one child added change QCoreApplication::processEvents(); QCOMPARE(root->children().count(), 1); - QCOMPARE(spy.events.size(), 1); // 1 child added 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 the parent node is dirty - QCOMPARE(spy.events.size(), 0); - QCOMPARE(spy.dirtyNodes.size(), 1); - QCOMPARE(spy.dirtyNodes.front(), root.data()); + QCOMPARE(arbiter.dirtyNodes().size(), 1); // 1 child added change + QCOMPARE(arbiter.dirtyNodes().front(), root.data()); } void tst_Nodes::checkConstructionWithNonRootParent() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; QScopedPointer<MyQEntity> root(new MyQEntity()); // WHEN - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); root->setSimulateBackendCreated(true); QScopedPointer<MyQNode> parent(new MyQNode(root.data())); @@ -1532,28 +1224,19 @@ void tst_Nodes::checkConstructionWithNonRootParent() QCOMPARE(root->children().count(), 1); QCOMPARE(parent->children().count(), 1); - QCOMPARE(spy.events.size(), 1); // 1 child added changes - - const auto parentNewChildEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(!parentNewChildEvent.isNull()); - QCOMPARE(parentNewChildEvent->subjectId(), root->id()); - QCOMPARE(parentNewChildEvent->propertyName(), "children"); - QCOMPARE(parentNewChildEvent->addedNodeId(), parent->id()); - - // Ensure second and last event is property set change - QCOMPARE(spy.dirtyNodes.size(), 1); - QCOMPARE(spy.dirtyNodes.front(), root.data()); + QCOMPARE(arbiter.dirtyNodes().size(), 1); // 1 child added changes + QCOMPARE(arbiter.dirtyNodes().front(), root.data()); } void tst_Nodes::checkConstructionAsListElement() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; QScopedPointer<MyQEntity> root(new MyQEntity()); // WHEN - root->setArbiterAndEngine(&spy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); root->setSimulateBackendCreated(true); // THEN @@ -1568,19 +1251,18 @@ void tst_Nodes::checkConstructionAsListElement() QCoreApplication::processEvents(); QCOMPARE(root->children().count(), 1); - QCOMPARE(spy.dirtyNodes.size(), 1); // 1 property change - QCOMPARE(spy.dirtySubNodes.size(), 1); // 1 child added change + QCOMPARE(arbiter.dirtyNodes().size(), 1); // 1 property change } void tst_Nodes::checkSceneIsSetOnConstructionWithParent() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QScene scene; QScopedPointer<MyQNode> root(new MyQNode()); // WHEN - root->setArbiterAndScene(&spy, &scene); + root->setArbiterAndScene(&arbiter, &scene); root->setSimulateBackendCreated(true); // THEN @@ -1603,9 +1285,9 @@ void tst_Nodes::checkSceneIsSetOnConstructionWithParent() QCoreApplication::processEvents(); QCOMPARE(root->children().count(), 1); QCOMPARE(subTreeRoot->children().count(), 5); - QCOMPARE(spy.events.size(), 1); // 1 child added (subTree to root) + QCOMPARE(arbiter.dirtyNodes().size(), 1); // 1 child added (subTree to root) - spy.events.clear(); + arbiter.clear(); // Add component in a separate loop to ensure components are added after // entities have been fully created @@ -1614,20 +1296,19 @@ void tst_Nodes::checkSceneIsSetOnConstructionWithParent() } // THEN - QCOMPARE(spy.events.size(), 0); - QCOMPARE(spy.dirtySubNodes.size(), 5); // 5 entities changed + QCOMPARE(arbiter.dirtyNodes().size(), 5); } void tst_Nodes::checkSubNodePostConstructIsCalledWhenReferincingNodeProperty() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; Qt3DCore::QScene scene(&engine); QScopedPointer<MyQNode> root(new MyQNode()); // WHEN - root->setArbiterAndScene(&spy, &scene); + root->setArbiterAndScene(&arbiter, &scene); root->setSimulateBackendCreated(true); // THEN @@ -1649,33 +1330,19 @@ void tst_Nodes::checkSubNodePostConstructIsCalledWhenReferincingNodeProperty() 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 - ObserverSpy entitySpy; - ObserverSpy componentSpy; + TestArbiter arbiter; { QScopedPointer<MyQEntity> entity(new MyQEntity()); - entity->setArbiterAndScene(&entitySpy); + entity->setArbiterAndScene(&arbiter); entity->setSimulateBackendCreated(true); MyQComponent *comp = new MyQComponent(); - comp->setArbiter(&componentSpy); + comp->setArbiter(&arbiter); // THEN QVERIFY(entity->parentNode() == nullptr); @@ -1690,15 +1357,7 @@ void tst_Nodes::appendingParentlessComponentToEntityWithoutScene() QVERIFY(entity->components().count() == 1); QVERIFY(entity->components().first() == comp); QVERIFY(comp->parentNode() == entity.data()); - QCOMPARE(entitySpy.events.size(), 0); - QCOMPARE(entitySpy.dirtyNodes.size(), 1); - QCOMPARE(entitySpy.dirtySubNodes.size(), 1); - - const auto event = entitySpy.dirtySubNodes.first(); - QCOMPARE(event.change, Qt3DCore::ComponentAdded); - QCOMPARE(event.node, entity.data()); - QCOMPARE(event.subNode, comp); - QCOMPARE(event.property, nullptr); + QCOMPARE(arbiter.dirtyNodes().size(), 1); // Note: since QEntity has no scene in this test case, we only have the // ComponentAdded event In theory we should also get the NodeCreated event @@ -1711,12 +1370,12 @@ void tst_Nodes::appendingParentlessComponentToEntityWithoutScene() void tst_Nodes::appendingParentlessComponentToNonRootEntity() { // GIVEN - ObserverSpy eventSpy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; { QScopedPointer<MyQEntity> root(new MyQEntity()); - root->setArbiterAndEngine(&eventSpy, &engine); + root->setArbiterAndEngine(&arbiter, &engine); root->setSimulateBackendCreated(true); QCoreApplication::processEvents(); @@ -1742,33 +1401,24 @@ void tst_Nodes::appendingParentlessComponentToNonRootEntity() QVERIFY(entity->components().first() == comp); QVERIFY(comp->parentNode() == entity.data()); - QCOMPARE(eventSpy.events.size(), 1); - // - entity added as child to root - QVERIFY(eventSpy.events.first().wasLocked()); + QCOMPARE(arbiter.dirtyNodes().size(), 2); + QCOMPARE(arbiter.dirtyNodes().at(0), root.data()); + QCOMPARE(arbiter.dirtyNodes().at(1), entity.data()); QVERIFY(Qt3DCore::QNodePrivate::get(entity.data())->m_hasBackendNode); QVERIFY(Qt3DCore::QNodePrivate::get(comp)->m_hasBackendNode); - - { - const auto event = eventSpy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(!event.isNull()); - QCOMPARE(event->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event->subjectId(), root->id()); - QCOMPARE(event->propertyName(), QByteArrayLiteral("children")); - QCOMPARE(event->addedNodeId(), entity->id()); - } } } void tst_Nodes::appendingParentlessComponentToEntityWithScene() { // GIVEN - ObserverSpy eventSpy; + TestArbiter arbiter; Qt3DCore::QAspectEngine engine; { QScopedPointer<MyQEntity> entity(new MyQEntity()); - entity->setArbiterAndEngine(&eventSpy, &engine); + entity->setArbiterAndEngine(&arbiter, &engine); entity->setSimulateBackendCreated(true); QCoreApplication::processEvents(); @@ -1790,18 +1440,7 @@ void tst_Nodes::appendingParentlessComponentToEntityWithScene() QVERIFY(entity->components().first() == comp); QVERIFY(comp->parentNode() == entity.data()); - QCOMPARE(eventSpy.events.size(), 1); - // - child added - QVERIFY(eventSpy.events.first().wasLocked()); - - { - const auto event = eventSpy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>(); - QVERIFY(!event.isNull()); - QCOMPARE(event->type(), Qt3DCore::PropertyValueAdded); - QCOMPARE(event->subjectId(), entity->id()); - QCOMPARE(event->propertyName(), QByteArrayLiteral("children")); - QCOMPARE(event->addedNodeId(), comp->id()); - } + QCOMPARE(arbiter.dirtyNodes().size(), 1); } } @@ -1809,13 +1448,12 @@ void tst_Nodes::appendingParentlessComponentToEntityWithScene() void tst_Nodes::appendingComponentToEntity() { // GIVEN - ObserverSpy entitySpy; - ObserverSpy componentSpy; + TestArbiter arbiter; { QScopedPointer<MyQEntity> entity(new MyQEntity()); - entity->setArbiterAndScene(&entitySpy); + entity->setArbiterAndScene(&arbiter); MyQComponent *comp = new MyQComponent(entity.data()); - comp->setArbiter(&componentSpy); + comp->setArbiter(&arbiter); QCoreApplication::processEvents(); // THEN @@ -1831,28 +1469,20 @@ void tst_Nodes::appendingComponentToEntity() QVERIFY(entity->components().count() == 1); QVERIFY(entity->components().first() == comp); QVERIFY(comp->parentNode() == entity.data()); - QCOMPARE(entitySpy.events.size(), 0); - QCOMPARE(entitySpy.dirtyNodes.size(), 1); - QCOMPARE(entitySpy.dirtySubNodes.size(), 1); - QCOMPARE(entitySpy.dirtyNodes.first(), entity.data()); - const auto event = entitySpy.dirtySubNodes.takeFirst(); - QCOMPARE(event.node, entity.data()); - QCOMPARE(event.subNode, comp); - QCOMPARE(event.change, Qt3DCore::ComponentAdded); - QCOMPARE(event.property, nullptr); + QCOMPARE(arbiter.dirtyNodes().size(), 1); + QCOMPARE(arbiter.dirtyNodes().first(), entity.data()); } } void tst_Nodes::removingComponentFromEntity() { // GIVEN - ObserverSpy entitySpy; - ObserverSpy componentSpy; + TestArbiter arbiter; { QScopedPointer<MyQEntity> entity(new MyQEntity()); - entity->setArbiterAndScene(&entitySpy); + entity->setArbiterAndScene(&arbiter); MyQComponent *comp = new MyQComponent(); - comp->setArbiter(&componentSpy); + comp->setArbiter(&arbiter); // WHEN entity->addComponent(comp); @@ -1863,42 +1493,28 @@ void tst_Nodes::removingComponentFromEntity() QVERIFY(comp->parent() == entity.data()); // WHEN - entitySpy.events.clear(); - entitySpy.dirtyNodes.clear(); - entitySpy.dirtySubNodes.clear(); - componentSpy.events.clear(); + arbiter.clear(); entity->removeComponent(comp); // THEN QVERIFY(entity->components().count() == 0); QVERIFY(comp->parent() == entity.data()); QVERIFY(entity->children().count() == 1); - QCOMPARE(entitySpy.events.size(), 0); - QCOMPARE(entitySpy.dirtyNodes.size(), 1); - QCOMPARE(entitySpy.dirtySubNodes.size(), 1); - QCOMPARE(componentSpy.events.size(), 0); - { - const auto event = entitySpy.dirtySubNodes.takeFirst(); - qDebug() << event.change; - QCOMPARE(event.change, Qt3DCore::ComponentRemoved); - QCOMPARE(event.node, entity.data()); - QCOMPARE(event.subNode, comp); - QCOMPARE(event.property, nullptr); - } + QCOMPARE(arbiter.dirtyNodes().size(), 1); } } void tst_Nodes::changeCustomProperty() { // GIVEN - ObserverSpy spy; + TestArbiter arbiter; QScopedPointer<MyQNode> node(new MyQNode()); - node->setArbiterAndScene(&spy); + node->setArbiterAndScene(&arbiter); // WHEN node->setCustomProperty(QStringLiteral("foo")); // THEN - QCOMPARE(spy.dirtyNodes.size(), 1); - QCOMPARE(spy.dirtyNodes.front(), node.data()); + QCOMPARE(arbiter.dirtyNodes().size(), 1); + QCOMPARE(arbiter.dirtyNodes().front(), node.data()); } void tst_Nodes::checkDestruction() @@ -2018,59 +1634,6 @@ void tst_Nodes::checkPropertyChanges() } } -void tst_Nodes::checkCreationData() -{ - // GIVEN - Qt3DCore::QNode root; - Qt3DCore::QNode node; - - node.setParent(&root); - node.setEnabled(true); - const QString enabledPropertyName = QStringLiteral("enabled"); - node.setDefaultPropertyTrackingMode(Qt3DCore::QNode::DontTrackValues); - node.setPropertyTracking(enabledPropertyName, Qt3DCore::QNode::TrackAllValues); - - // WHEN - QVector<Qt3DCore::QNodeCreatedChangeBasePtr> creationChanges; - - { - Qt3DCore::QNodeCreatedChangeGenerator creationChangeGenerator(&node); - creationChanges = creationChangeGenerator.creationChanges(); - } - - // THEN - { - QCOMPARE(creationChanges.size(), 1); - - const auto creationChangeData = qSharedPointerCast<Qt3DCore::QNodeCreatedChangeBase>(creationChanges.first()); - - QCOMPARE(node.id(), creationChangeData->subjectId()); - QCOMPARE(node.isEnabled(), true); - QCOMPARE(node.isEnabled(), creationChangeData->isNodeEnabled()); - QCOMPARE(node.metaObject(), creationChangeData->metaObject()); - } - - // WHEN - node.setEnabled(false); - - { - Qt3DCore::QNodeCreatedChangeGenerator creationChangeGenerator(&node); - creationChanges = creationChangeGenerator.creationChanges(); - } - - // THEN - { - QCOMPARE(creationChanges.size(), 1); - - const auto creationChangeData = qSharedPointerCast<Qt3DCore::QNodeCreatedChangeBase>(creationChanges.first()); - - QCOMPARE(node.id(), creationChangeData->subjectId()); - QCOMPARE(node.isEnabled(), false); - QCOMPARE(node.isEnabled(), creationChangeData->isNodeEnabled()); - QCOMPARE(node.metaObject(), creationChangeData->metaObject()); - } -} - void tst_Nodes::checkEnabledUpdate() { // GIVEN @@ -2083,11 +1646,10 @@ void tst_Nodes::checkEnabledUpdate() node.setEnabled(false); // THEN - QCOMPARE(arbiter.events.size(), 0); - QCOMPARE(arbiter.dirtyNodes.size(), 1); - QCOMPARE(arbiter.dirtyNodes.front(), &node); + QCOMPARE(arbiter.dirtyNodes().size(), 1); + QCOMPARE(arbiter.dirtyNodes().front(), &node); - arbiter.dirtyNodes.clear(); + arbiter.clear(); } { @@ -2095,8 +1657,7 @@ void tst_Nodes::checkEnabledUpdate() node.setEnabled(false); // THEN - QCOMPARE(arbiter.events.size(), 0); - QCOMPARE(arbiter.dirtyNodes.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } } @@ -2114,7 +1675,7 @@ void tst_Nodes::checkPropertyTrackModeUpdate() QCoreApplication::processEvents(); // THEN -> this properties is non notifying - QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } { @@ -2123,7 +1684,7 @@ void tst_Nodes::checkPropertyTrackModeUpdate() QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } } @@ -2141,7 +1702,7 @@ void tst_Nodes::checkTrackedPropertyNamesUpdate() QCoreApplication::processEvents(); // THEN -> this properties is non notifying - QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } { @@ -2150,7 +1711,7 @@ void tst_Nodes::checkTrackedPropertyNamesUpdate() QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } } @@ -2170,17 +1731,15 @@ void tst_Nodes::checkNodeRemovedFromDirtyListOnDestruction() node->setEnabled(false); // THEN - QCOMPARE(arbiter.events.size(), 0); - QCOMPARE(arbiter.dirtyNodes.size(), 1); - QCOMPARE(arbiter.dirtyNodes.front(), node.data()); + QCOMPARE(arbiter.dirtyNodes().size(), 1); + QCOMPARE(arbiter.dirtyNodes().front(), node.data()); // WHEN // scene should be unset and node removed from arbiter dirtyList node.reset(); // THEN - QCOMPARE(arbiter.events.size(), 0); - QCOMPARE(arbiter.dirtyNodes.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } { // GIVEN @@ -2196,17 +1755,16 @@ void tst_Nodes::checkNodeRemovedFromDirtyListOnDestruction() child->setEnabled(false); // THEN - QCOMPARE(arbiter.events.size(), 1); // childAdded - QCOMPARE(arbiter.dirtyNodes.size(), 1); - QCOMPARE(arbiter.dirtyNodes.front(), child); + QCOMPARE(arbiter.dirtyNodes().size(), 2); + QCOMPARE(arbiter.dirtyNodes().at(0), node.data()); + QCOMPARE(arbiter.dirtyNodes().at(1), child); // WHEN // scene should be unset and child node removed from arbiter dirtyList node.reset(); // THEN - QCOMPARE(arbiter.events.size(), 1); // childRemoved (no destroyed change since we had no backend) - QCOMPARE(arbiter.dirtyNodes.size(), 0); + QCOMPARE(arbiter.dirtyNodes().size(), 0); } } |