diff options
author | Liang Qi <liang.qi@qt.io> | 2018-01-22 10:00:02 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2018-01-22 10:00:02 +0000 |
commit | 2b19bde378e084331b1b7ba9aa076270492999bb (patch) | |
tree | d0f00fdbf48852e5b872dcd315ba3ee6e83b2556 /tests | |
parent | e335ab9fbcb45840857a2abd107853947fedc178 (diff) | |
parent | 520b9823954628f66b256bcf6e0c96f30ed4f625 (diff) |
Merge "Merge remote-tracking branch 'origin/5.9' into 5.10" into refs/staging/5.10
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/core/nodes/tst_nodes.cpp | 74 | ||||
-rw-r--r-- | tests/auto/render/commons/testrenderer.h | 2 |
2 files changed, 75 insertions, 1 deletions
diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp index 25c2a6dba..49618821c 100644 --- a/tests/auto/core/nodes/tst_nodes.cpp +++ b/tests/auto/core/nodes/tst_nodes.cpp @@ -80,6 +80,7 @@ private slots: void removingChildEntitiesFromNode(); void checkConstructionSetParentMix(); // QTBUG-60612 + void checkConstructionWithParent(); void appendingComponentToEntity(); void appendingParentlessComponentToEntity(); @@ -169,13 +170,17 @@ void SimplePostman::notifyBackend(const Qt3DCore::QSceneChangePtr &change) m_spy->sceneChangeEventWithLock(change); } + + class MyQNode : public Qt3DCore::QNode { Q_OBJECT Q_PROPERTY(QString customProperty READ customProperty WRITE setCustomProperty NOTIFY customPropertyChanged) + Q_PROPERTY(MyQNode *nodeProperty READ nodeProperty WRITE setNodeProperty NOTIFY nodePropertyChanged) public: explicit MyQNode(Qt3DCore::QNode *parent = 0) : QNode(parent) + , m_nodeProperty(nullptr) {} ~MyQNode() @@ -211,11 +216,37 @@ public: Qt3DCore::QNodePrivate::get(this)->m_hasBackendNode = created; } + MyQNode *nodeProperty() const { return m_nodeProperty; } + +public slots: + void setNodeProperty(MyQNode *node) + { + Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(this); + if (m_nodeProperty == node) + return; + + if (m_nodeProperty) + d->unregisterDestructionHelper(m_nodeProperty); + + if (node && !node->parent()) + node->setParent(this); + + m_nodeProperty = node; + + // Ensures proper bookkeeping + if (m_nodeProperty) + d->registerDestructionHelper(m_nodeProperty, &MyQNode::setNodeProperty, m_nodeProperty); + + emit nodePropertyChanged(node); + } + signals: void customPropertyChanged(); + void nodePropertyChanged(MyQNode *node); protected: QString m_customProperty; + MyQNode *m_nodeProperty; }; class MyQEntity : public Qt3DCore::QEntity @@ -847,6 +878,49 @@ void tst_Nodes::checkConstructionSetParentMix() QCOMPARE(lastEvent->addedNodeId(), subTreeRoot->id()); } +void tst_Nodes::checkConstructionWithParent() +{ + // GIVEN + ObserverSpy spy; + Qt3DCore::QScene scene; + QScopedPointer<MyQNode> root(new MyQNode()); + + // WHEN + root->setArbiterAndScene(&spy, &scene); + root->setSimulateBackendCreated(true); + + // THEN + QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->scene() != nullptr); + + // WHEN we create a child and then set it as a Node* property + auto *node = new MyQNode(root.data()); + root->setNodeProperty(node); + + // THEN we should get one creation change, one child added change + // and one property change event, in that order. + QCoreApplication::processEvents(); + QCOMPARE(root->children().count(), 1); + QCOMPARE(spy.events.size(), 3); // 1 creation change, 1 child added change, 1 property change + + // Ensure first event is child node's creation change + const auto creationEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QNodeCreatedChangeBase>(); + QVERIFY(!creationEvent.isNull()); + QCOMPARE(creationEvent->subjectId(), node->id()); + + 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::QPropertyUpdatedChange>(); + QVERIFY(!propertyEvent.isNull()); + QCOMPARE(propertyEvent->subjectId(), root->id()); + QCOMPARE(propertyEvent->propertyName(), "nodeProperty"); + QCOMPARE(propertyEvent->value().value<Qt3DCore::QNodeId>(), node->id()); +} + void tst_Nodes::appendingParentlessComponentToEntity() { // GIVEN diff --git a/tests/auto/render/commons/testrenderer.h b/tests/auto/render/commons/testrenderer.h index 031ca214b..20ab032b1 100644 --- a/tests/auto/render/commons/testrenderer.h +++ b/tests/auto/render/commons/testrenderer.h @@ -52,7 +52,7 @@ public: void shutdown() Q_DECL_OVERRIDE {} void releaseGraphicsResources() Q_DECL_OVERRIDE {} void render() Q_DECL_OVERRIDE {} - void doRender() Q_DECL_OVERRIDE {} + void doRender(bool scene3dBlocking = false) Q_DECL_OVERRIDE { Q_UNUSED(scene3dBlocking); } void cleanGraphicsResources() Q_DECL_OVERRIDE {} bool isRunning() const Q_DECL_OVERRIDE { return true; } bool shouldRender() Q_DECL_OVERRIDE { return true; } |