summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2018-07-04 08:17:02 +0200
committerPaul Lemire <paul.lemire@kdab.com>2018-07-04 09:03:49 +0000
commite75e49434fa8930037ae72b50c998e899739b91f (patch)
tree479a9c9bf52290ef15d8dcf76f38f4ac9bb54dff /tests
parent895cd926ba6d420e72a7d2ae2bb0624ab7aeb791 (diff)
Handle reparenting to nodes which have no backend
Change-Id: Ibbaae84a616afbe8be35904e9185be668e32f1c7 Task-number: QTBUG-69284 Reviewed-by: Mike Krus <mike.krus@kdab.com> Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/core/nodes/tst_nodes.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp
index baf7010b0..d81a229cc 100644
--- a/tests/auto/core/nodes/tst_nodes.cpp
+++ b/tests/auto/core/nodes/tst_nodes.cpp
@@ -72,6 +72,7 @@ private slots:
void checkParentChangeToNull();
void checkParentChangeToOtherParent();
+ void checkParentChangeFromExistingBackendParentToNewlyCreatedParent();
void removingSingleChildNodeFromNode();
void removingMultipleChildNodesFromNode();
@@ -739,6 +740,163 @@ void tst_Nodes::checkParentChangeToOtherParent()
QCOMPARE(event2->metaObject(), child->metaObject());
}
+void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent()
+{
+ // GIVEN
+ Qt3DCore::QScene scene;
+ ObserverSpy spy;
+ QScopedPointer<MyQNode> root(new MyQNode());
+ root->setArbiterAndScene(&spy, &scene);
+ MyQNode *child(new MyQNode(root.data()));
+ MyQNode *child2(new MyQNode(root.data()));
+ QCoreApplication::processEvents();
+
+ // Due to the way we create root, it never has a backend
+ QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->m_hasBackendNode == false);
+
+ // THEN
+ QCOMPARE(spy.events.size(), 4); // 2 x (1 node created change, 1 child added to parent change)
+
+ // WHEN -> Reparenting child with backend node to new parent with no backend yet
+ spy.events.clear();
+ QScopedPointer<Qt3DCore::QNode> newParent(new MyQNode(root.data()));
+ child->setParent(newParent.data());
+
+ // THEN
+ QVERIFY(child->parent() == newParent.data());
+ QCOMPARE(newParent->childNodes().size(), 1);
+ QCOMPARE(child2->childNodes().size(), 0);
+ QCOMPARE(root->childNodes().size(), 2);
+ QVERIFY(Qt3DCore::QNodePrivate::get(newParent.data())->m_hasBackendNode == false);
+ QVERIFY(Qt3DCore::QNodePrivate::get(child)->m_hasBackendNode == false);
+ QVERIFY(Qt3DCore::QNodePrivate::get(newParent.data())->scene() != nullptr);
+ QVERIFY(Qt3DCore::QNodePrivate::get(child)->scene() != nullptr);
+
+ // WHEN
+ QCoreApplication::processEvents();
+
+ // THEN
+ QCOMPARE(spy.events.size(), 5);
+ // 1 node removed change, 1 node destroyed change,
+ // 2 node created change, 1 node added to children change
+ 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());
+
+ // CHECK event 2 is a Node Destroyed
+ QVERIFY(spy.events.first().wasLocked());
+ const Qt3DCore::QNodeDestroyedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeDestroyedChange>();
+ QCOMPARE(event2->type(), Qt3DCore::NodeDeleted);
+ QCOMPARE(event2->subtreeIdsAndTypes().size(), 1);
+ QCOMPARE(event2->subtreeIdsAndTypes().first().id, child->id());
+
+ // CHECK event 3 and 4 are Node Created events
+ const Qt3DCore::QNodeCreatedChangeBasePtr event3 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeCreatedChangeBase>();
+ const Qt3DCore::QNodeCreatedChangeBasePtr event4 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeCreatedChangeBase>();
+
+ QCOMPARE(event3->type(), Qt3DCore::NodeCreated);
+ QCOMPARE(event3->parentId(), root->id());
+ QCOMPARE(event3->subjectId(), newParent->id());
+
+ QCOMPARE(event4->type(), Qt3DCore::NodeCreated);
+ QCOMPARE(event4->parentId(), newParent->id());
+ QCOMPARE(event4->subjectId(), child->id());
+
+ const Qt3DCore::QPropertyNodeAddedChangePtr event5 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>();
+ QCOMPARE(event5->type(), Qt3DCore::PropertyValueAdded);
+ QCOMPARE(event5->addedNodeId(), newParent->id());
+ QCOMPARE(event5->metaObject(), newParent->metaObject());
+ QCOMPARE(event5->subjectId(), root->id());
+ }
+
+ // WHEN -> Changing parent to node with existing backend
+ 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());
+ }
+
+ QVERIFY(Qt3DCore::QNodePrivate::get(child)->m_hasBackendNode == true);
+ QCOMPARE(root->childNodes().size(), 2);
+ QCOMPARE(child2->childNodes().size(), 1);
+ QCOMPARE(newParent->childNodes().size(), 0);
+
+ // WHEN -> Changing to parent which has no backend
+ QScopedPointer<Qt3DCore::QNode> newParent2(new MyQNode(root.data()));
+ child->setParent(newParent2.data());
+
+ // THEN
+ QVERIFY(Qt3DCore::QNodePrivate::get(newParent2.data())->m_hasBackendNode == false);
+ QVERIFY(Qt3DCore::QNodePrivate::get(child)->m_hasBackendNode == false);
+ QVERIFY(Qt3DCore::QNodePrivate::get(newParent2.data())->scene() != nullptr);
+ QVERIFY(Qt3DCore::QNodePrivate::get(child)->scene() != nullptr);
+
+ // WHEN
+ QCoreApplication::processEvents();
+
+ // THEN
+ QCOMPARE(spy.events.size(), 5);
+ // 1 node removed change, 1 node destroyed change,
+ // 2 node created 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());
+
+ // CHECK event 2 is a Node Destroyed
+ QVERIFY(spy.events.first().wasLocked());
+ const Qt3DCore::QNodeDestroyedChangePtr event2 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeDestroyedChange>();
+ QCOMPARE(event2->type(), Qt3DCore::NodeDeleted);
+ QCOMPARE(event2->subtreeIdsAndTypes().size(), 1);
+ QCOMPARE(event2->subtreeIdsAndTypes().first().id, child->id());
+
+ // CHECK event 3 and 4 are Node Created events
+ const Qt3DCore::QNodeCreatedChangeBasePtr event3 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeCreatedChangeBase>();
+ const Qt3DCore::QNodeCreatedChangeBasePtr event4 = spy.events.takeFirst().change().staticCast<Qt3DCore::QNodeCreatedChangeBase>();
+
+ QCOMPARE(event3->type(), Qt3DCore::NodeCreated);
+ QCOMPARE(event3->parentId(), root->id());
+ QCOMPARE(event3->subjectId(), newParent2->id());
+
+ QCOMPARE(event4->type(), Qt3DCore::NodeCreated);
+ QCOMPARE(event4->parentId(), newParent2->id());
+ QCOMPARE(event4->subjectId(), child->id());
+
+ const Qt3DCore::QPropertyNodeAddedChangePtr event5 = spy.events.takeFirst().change().staticCast<Qt3DCore::QPropertyNodeAddedChange>();
+ QCOMPARE(event5->type(), Qt3DCore::PropertyValueAdded);
+ QCOMPARE(event5->addedNodeId(), newParent2->id());
+ QCOMPARE(event5->metaObject(), newParent2->metaObject());
+ QCOMPARE(event5->subjectId(), root->id());
+ }
+}
+
void tst_Nodes::removingSingleChildNodeFromNode()
{
// GIVEN