diff options
Diffstat (limited to 'tests')
4 files changed, 102 insertions, 54 deletions
diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp index 0ec661fed..2e73e6c34 100644 --- a/tests/auto/core/nodes/tst_nodes.cpp +++ b/tests/auto/core/nodes/tst_nodes.cpp @@ -81,6 +81,7 @@ private slots: void checkConstructionSetParentMix(); // QTBUG-60612 void checkConstructionWithParent(); + void checkConstructionAsListElement(); void appendingComponentToEntity(); void appendingParentlessComponentToEntity(); @@ -240,6 +241,43 @@ public slots: emit nodePropertyChanged(node); } + void addAttribute(MyQNode *attribute) + { + Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(this); + if (!m_attributes.contains(attribute)) { + m_attributes.append(attribute); + + // Ensures proper bookkeeping + d->registerDestructionHelper(attribute, &MyQNode::removeAttribute, m_attributes); + + // We need to add it as a child of the current node if it has been declared inline + // Or not previously added as a child of the current node so that + // 1) The backend gets notified about it's creation + // 2) When the current node is destroyed, it gets destroyed as well + 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); + } + } + } + + 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); + } + m_attributes.removeOne(attribute); + // Remove bookkeeping connection + d->unregisterDestructionHelper(attribute); + } + signals: void customPropertyChanged(); void nodePropertyChanged(MyQNode *node); @@ -247,6 +285,7 @@ signals: protected: QString m_customProperty; MyQNode *m_nodeProperty; + QVector<MyQNode *> m_attributes; }; class MyQEntity : public Qt3DCore::QEntity @@ -921,6 +960,50 @@ void tst_Nodes::checkConstructionWithParent() QCOMPARE(propertyEvent->value().value<Qt3DCore::QNodeId>(), node->id()); } +void tst_Nodes::checkConstructionAsListElement() +{ + // 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->addAttribute(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::QPropertyNodeAddedChange>(); + QVERIFY(!propertyEvent.isNull()); + QCOMPARE(propertyEvent->subjectId(), root->id()); + QCOMPARE(propertyEvent->propertyName(), "attribute"); + QCOMPARE(newChildEvent->addedNodeId(), node->id()); +} + void tst_Nodes::appendingParentlessComponentToEntity() { // GIVEN diff --git a/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp b/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp index 83e816861..4d4a08a34 100644 --- a/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp +++ b/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp @@ -192,35 +192,6 @@ private Q_SLOTS: QCOMPARE(backendFilterCompatibleTechniqueJob.renderer(), &renderer); } - void checkRunRendererNotRunning() - { - // GIVEN - Qt3DRender::Render::FilterCompatibleTechniqueJob backendFilterCompatibleTechniqueJob; - Qt3DRender::TestAspect testAspect(buildTestScene()); - - // WHEN - Qt3DRender::Render::NodeManagers *nodeManagers = testAspect.nodeManagers(); - QVERIFY(nodeManagers); - Qt3DRender::Render::TechniqueManager *techniqueManager = nodeManagers->techniqueManager(); - QVERIFY(techniqueManager); - backendFilterCompatibleTechniqueJob.setManager(techniqueManager); - backendFilterCompatibleTechniqueJob.setRenderer(testAspect.renderer()); - testAspect.initializeRenderer(); - testAspect.renderer()->shutdown(); - - // THEN - QCOMPARE(testAspect.renderer()->isRunning(), false); - QVector<Qt3DRender::Render::HTechnique> handles = testAspect.nodeManagers()->techniqueManager()->activeHandles(); - QCOMPARE(handles.size(), 3); - - // WHEN - backendFilterCompatibleTechniqueJob.run(); - - // THEN -> untouched since not running - const QVector<Qt3DCore::QNodeId> dirtyTechniquesId = testAspect.nodeManagers()->techniqueManager()->takeDirtyTechniques(); - QCOMPARE(dirtyTechniquesId.size(), 3); - } - void checkRunRendererRunning() { // GIVEN diff --git a/tests/auto/render/renderer/tst_renderer.cpp b/tests/auto/render/renderer/tst_renderer.cpp index a2ea993e8..cfccf8b78 100644 --- a/tests/auto/render/renderer/tst_renderer.cpp +++ b/tests/auto/render/renderer/tst_renderer.cpp @@ -60,6 +60,9 @@ private Q_SLOTS: renderer.setSettings(&settings); renderer.initialize(); + // NOTE: FilterCompatibleTechniqueJob and ShaderGathererJob cannot run because the context + // is not initialized in this test + const int singleRenderViewJobCount = 11 + 1 * Qt3DRender::Render::RenderViewBuilder::optimalJobCount(); // RenderViewBuilder renderViewJob, // renderableEntityFilterJob, @@ -84,7 +87,6 @@ private Q_SLOTS: 1 + // cleanupJob 1 + // sendRenderCaptureJob 1 + // sendBufferCaptureJob - 1 + // filterCompatibleTechniquesJob 1 + // VAOGatherer 1 + // updateSkinningPaletteJob singleRenderViewJobCount); // Only valid for the first call to renderBinJobs(), since subsequent calls won't have the renderqueue reset @@ -100,7 +102,6 @@ private Q_SLOTS: 1 + // cleanupJob 1 + // sendRenderCaptureJob 1 + // sendBufferCaptureJob - 1 + // filterCompatibleTechniquesJob 1 + // VAOGatherer 1 + // updateSkinningPaletteJob 1); // EntityEnabledDirty @@ -117,7 +118,6 @@ private Q_SLOTS: 1 + // cleanupJob 1 + // sendRenderCaptureJob 1 + // sendBufferCaptureJob - 1 + // filterCompatibleTechniquesJob 1 + // VAOGatherer 1 + // WorldTransformJob 1 + // UpdateWorldBoundingVolume @@ -137,7 +137,6 @@ private Q_SLOTS: 1 + // cleanupJob 1 + // sendRenderCaptureJob 1 + // sendBufferCaptureJob - 1 + // filterCompatibleTechniquesJob 1 + // VAOGatherer 1 + // CalculateBoundingVolumeJob 1 + // UpdateMeshTriangleListJob @@ -156,7 +155,6 @@ private Q_SLOTS: 1 + // cleanupJob 1 + // sendRenderCaptureJob 1 + // sendBufferCaptureJob - 1 + // filterCompatibleTechniquesJob 1 + // VAOGatherer 1 + // updateSkinningPaletteJob 1); // BufferGathererJob @@ -164,23 +162,6 @@ private Q_SLOTS: renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); // WHEN - renderer.markDirty(Qt3DRender::Render::AbstractRenderer::ShadersDirty, nullptr); - jobs = renderer.renderBinJobs(); - - // THEN (level - QCOMPARE(jobs.size(), - 1 + // updateLevelOfDetailJob - 1 + // cleanupJob - 1 + // sendRenderCaptureJob - 1 + // sendBufferCaptureJob - 1 + // filterCompatibleTechniquesJob - 1 + // VAOGatherer - 1 + // updateSkinningPaletteJob - 1); // ShaderGathererJob - - renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); - - // WHEN renderer.markDirty(Qt3DRender::Render::AbstractRenderer::TexturesDirty, nullptr); jobs = renderer.renderBinJobs(); @@ -190,7 +171,6 @@ private Q_SLOTS: 1 + // cleanupJob 1 + // sendRenderCaptureJob 1 + // sendBufferCaptureJob - 1 + // filterCompatibleTechniquesJob 1 + // VAOGatherer 1 + // TexturesGathererJob 1 + // updateSkinningPaletteJob @@ -208,7 +188,6 @@ private Q_SLOTS: 1 + // cleanupJob 1 + // sendRenderCaptureJob 1 + // sendBufferCaptureJob - 1 + // filterCompatibleTechniquesJob 1 + // VAOGatherer 1 + // EntityEnabledDirty 1 + // WorldTransformJob @@ -218,7 +197,6 @@ private Q_SLOTS: 1 + // CalculateBoundingVolumeJob 1 + // UpdateMeshTriangleListJob 1 + // BufferGathererJob - 1 + // ShaderGathererJob 1 + // TexturesGathererJob 1 + // updateSkinningPaletteJob 1); // SyncTexturesGathererJob diff --git a/tests/auto/render/technique/tst_technique.cpp b/tests/auto/render/technique/tst_technique.cpp index a712434d1..7dfd5b85c 100644 --- a/tests/auto/render/technique/tst_technique.cpp +++ b/tests/auto/render/technique/tst_technique.cpp @@ -193,6 +193,8 @@ private Q_SLOTS: // THEN QCOMPARE(backendTechnique.isEnabled(), newValue); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); } { // WHEN @@ -217,6 +219,8 @@ private Q_SLOTS: QCOMPARE(dirtyTechniques.size(), 1); QCOMPARE(dirtyTechniques.first(), backendTechnique.peerId()); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); } { Qt3DRender::QParameter parameter; @@ -230,6 +234,8 @@ private Q_SLOTS: // THEN QCOMPARE(backendTechnique.parameters().size(), 1); QCOMPARE(backendTechnique.parameters().first(), parameter.id()); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); } { // WHEN @@ -239,6 +245,8 @@ private Q_SLOTS: // THEN QCOMPARE(backendTechnique.parameters().size(), 0); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); } } { @@ -253,6 +261,8 @@ private Q_SLOTS: // THEN QCOMPARE(backendTechnique.filterKeys().size(), 1); QCOMPARE(backendTechnique.filterKeys().first(), filterKey.id()); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); } { // WHEN @@ -262,6 +272,8 @@ private Q_SLOTS: // THEN QCOMPARE(backendTechnique.filterKeys().size(), 0); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); } } { @@ -276,6 +288,8 @@ private Q_SLOTS: // THEN QCOMPARE(backendTechnique.renderPasses().size(), 1); QCOMPARE(backendTechnique.renderPasses().first(), pass.id()); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); } { // WHEN @@ -285,6 +299,8 @@ private Q_SLOTS: // THEN QCOMPARE(backendTechnique.renderPasses().size(), 0); + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::TechniquesDirty); + renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); } } } |