summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/core/nodes/tst_nodes.cpp83
-rw-r--r--tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp29
-rw-r--r--tests/auto/render/renderer/tst_renderer.cpp28
-rw-r--r--tests/auto/render/technique/tst_technique.cpp16
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);
}
}
}