summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2022-01-31 13:07:33 +0100
committerPaul Lemire <paul.lemire@kdab.com>2022-02-07 10:06:42 +0100
commit934dd2468667cf121ee900b04aec3cfe1544090c (patch)
tree96ea63fc745124c761d413e9aff1b5452b601ea5
parent220abad34731351f676eec9c17b833002de5166f (diff)
downloadqt3d-934dd2468667cf121ee900b04aec3cfe1544090c.tar.gz
tst_qchangearbiter: remove tests for message based synching
Since 5.14, we are not relying on messages to sync nodes but rather calling the BackendNode::syncFromFrontEnd when a sync is needed. Change-Id: I556519f1f17714457ce610c667660f9ccc1e8e06 Task-number: QTBUG-98421 Reviewed-by: Mike Krus <mike.krus@kdab.com>
-rw-r--r--tests/auto/core/qchangearbiter/qchangearbiter.pro2
-rw-r--r--tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp810
2 files changed, 26 insertions, 786 deletions
diff --git a/tests/auto/core/qchangearbiter/qchangearbiter.pro b/tests/auto/core/qchangearbiter/qchangearbiter.pro
index 64a7b36e7..4628bf6cd 100644
--- a/tests/auto/core/qchangearbiter/qchangearbiter.pro
+++ b/tests/auto/core/qchangearbiter/qchangearbiter.pro
@@ -6,3 +6,5 @@ QT += testlib core core-private 3dcore 3dcore-private
SOURCES += \
tst_qchangearbiter.cpp
+
+include(../common/common.pri)
diff --git a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
index 4837ac87b..9f79e4272 100644
--- a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
+++ b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp
@@ -31,17 +31,7 @@
QT_WARNING_DISABLE_DEPRECATED
#include <QtTest/QTest>
-#include <Qt3DCore/private/qobserverinterface_p.h>
-#include <Qt3DCore/private/qobservableinterface_p.h>
#include <Qt3DCore/private/qchangearbiter_p.h>
-#include <Qt3DCore/private/qpostman_p.h>
-#include <Qt3DCore/qscenechange.h>
-#include <Qt3DCore/qcomponentaddedchange.h>
-#include <Qt3DCore/qcomponentremovedchange.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
-#include <Qt3DCore/qpropertynodeaddedchange.h>
-#include <Qt3DCore/qpropertynoderemovedchange.h>
-#include <Qt3DCore/qscenechange.h>
#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DCore/qnode.h>
#include <Qt3DCore/qentity.h>
@@ -51,95 +41,14 @@ QT_WARNING_DISABLE_DEPRECATED
#include <Qt3DCore/private/qbackendnode_p.h>
#include <QThread>
#include <QWaitCondition>
+#include "testpostmanarbiter.h"
class tst_QChangeArbiter : public QObject
{
Q_OBJECT
private slots:
- void registerObservers();
- void registerSceneObserver();
- void unregisterObservers();
- void unregisterSceneObservers();
- void distributeFrontendChanges();
- void distributePropertyChanges();
- void distributeBackendChanges();
-};
-
-class AllChangesChange : public Qt3DCore::QSceneChange
-{
-public:
- AllChangesChange(Qt3DCore::QNodeId subjectId)
- : Qt3DCore::QSceneChange(Qt3DCore::AllChanges, subjectId)
- {
- }
-};
-
-class tst_Node : public Qt3DCore::QEntity
-{
-public:
- explicit tst_Node(Qt3DCore::QNode *parent = 0) : Qt3DCore::QEntity(parent)
- {}
-
- void sendNodeAddedNotification(QNode *node)
- {
- Qt3DCore::QPropertyNodeAddedChangePtr e(new Qt3DCore::QPropertyNodeAddedChange(id(), node));
- e->setPropertyName("PropertyValueAdded");
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendNodeRemovedNotification(QNode *node)
- {
- Qt3DCore::QPropertyNodeRemovedChangePtr e(new Qt3DCore::QPropertyNodeRemovedChange(id(), node));
- e->setPropertyName("PropertyValueRemoved");
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendNodeUpdatedNotification()
- {
- Qt3DCore::QPropertyUpdatedChangePtr e(new Qt3DCore::QPropertyUpdatedChange(id()));
- e->setPropertyName("PropertyUpdated");
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendComponentAddedNotification(Qt3DCore::QComponent *component)
- {
- Qt3DCore::QComponentAddedChangePtr e(new Qt3DCore::QComponentAddedChange(this, component));
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendComponentRemovedNotification(Qt3DCore::QComponent *component)
- {
- Qt3DCore::QComponentRemovedChangePtr e(new Qt3DCore::QComponentRemovedChange(this, component));
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sendAllChangesNotification()
- {
- Qt3DCore::QSceneChangePtr e(new AllChangesChange(id()));
- Qt3DCore::QNodePrivate::get(this)->notifyObservers(e);
- }
-
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) override
- {
- QVERIFY(!change.isNull());
- m_lastChanges << change;
- }
-
- Qt3DCore::QSceneChangePtr lastChange() const
- {
- if (m_lastChanges.isEmpty())
- return Qt3DCore::QSceneChangePtr();
- return m_lastChanges.last();
- }
-
- QList<Qt3DCore::QSceneChangePtr> lastChanges() const
- {
- return m_lastChanges;
- }
-
-private:
- QList<Qt3DCore::QSceneChangePtr> m_lastChanges;
+ void recordsDirtyNodes();
};
// used to test property change notifications
@@ -180,722 +89,51 @@ private:
float m_prop2 = 0.0f;
};
-class tst_SimpleObserver : public Qt3DCore::QObserverInterface
-{
-public:
-
- // QObserverInterface interface
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override
- {
- QVERIFY(!e.isNull());
- m_lastChanges.append(e);
- }
-
- Qt3DCore::QSceneChangePtr lastChange() const
- {
- if (m_lastChanges.isEmpty())
- return Qt3DCore::QSceneChangePtr();
- return m_lastChanges.last();
- }
-
- QList<Qt3DCore::QSceneChangePtr> lastChanges() const
- {
- return m_lastChanges;
- }
-
- void clear()
- {
- m_lastChanges.clear();
- }
-
-private:
- QList<Qt3DCore::QSceneChangePtr> m_lastChanges;
-};
-
-class tst_BackendObserverObservable : public Qt3DCore::QBackendNode
-{
-public:
-
- tst_BackendObserverObservable()
- : Qt3DCore::QBackendNode(ReadWrite)
- {}
-
- // QObserverInterface interface
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override
- {
- QVERIFY(!e.isNull());
- m_lastChanges << e;
- m_targetId = e->subjectId();
- }
-
- // should be called in thread
- void sendReply()
- {
- Qt3DCore::QPropertyUpdatedChangePtr reply;
- reply = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(m_targetId);
- reply->setDeliveryFlags(Qt3DCore::QSceneChange::DeliverToAll);
- reply->setPropertyName("Reply");
- notifyObservers(reply);
- qDebug() << Q_FUNC_INFO;
- }
-
- Qt3DCore::QSceneChangePtr lastChange() const
- {
- if (m_lastChanges.isEmpty())
- return Qt3DCore::QSceneChangePtr();
- return m_lastChanges.last();
- }
-
- QList<Qt3DCore::QSceneChangePtr> lastChanges() const
- {
- return m_lastChanges;
- }
-
- void clear()
- {
- m_lastChanges.clear();
- }
-
-private:
- QList<Qt3DCore::QSceneChangePtr> m_lastChanges;
- Qt3DCore::QNodeId m_targetId;
-
-};
-
-class ThreadedAnswer : public QThread
-{
- Q_OBJECT
-public:
- ThreadedAnswer(Qt3DCore::QChangeArbiter *arbiter, tst_BackendObserverObservable *backend)
- : QThread()
- , m_arbiter(arbiter)
- , m_backendObs(backend)
- {}
-
- ~ThreadedAnswer() { qDebug() << this; }
-
- void run() override
- {
- // create backend change queue on QChangeArbiter
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(m_arbiter);
- m_backendObs->sendReply();
- // gives time for other threads to start waiting
- QThread::currentThread()->sleep(1);
- // wake waiting condition
- m_waitingForReplyToBeSent.wakeOne();
- exec();
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(m_arbiter);
- }
-
- QWaitCondition *waitingCondition() { return &m_waitingForReplyToBeSent; }
-
-private:
- Qt3DCore::QChangeArbiter *m_arbiter;
- tst_BackendObserverObservable *m_backendObs;
- QWaitCondition m_waitingForReplyToBeSent;
-};
-
-class tst_PostManObserver : public Qt3DCore::QAbstractPostman
-{
-public:
-
- tst_PostManObserver()
- : m_sceneInterface(nullptr)
- , m_allowFrontendNotifications(false)
- {}
-
- void setScene(Qt3DCore::QScene *scene) final
- {
- m_sceneInterface = scene;
- }
-
- void setAllowFrontendNotifications(bool allow)
- {
- m_allowFrontendNotifications = allow;
- }
-
- // QObserverInterface interface
- void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
- {
- QVERIFY(!e.isNull());
- Qt3DCore::QPropertyUpdatedChangePtr change = qSharedPointerDynamicCast<Qt3DCore::QPropertyUpdatedChange>(e);
- QVERIFY(!change.isNull());
- Qt3DCore::QNode *targetNode = m_sceneInterface->lookupNode(change->subjectId());
- QVERIFY(targetNode != nullptr);
- m_lastChanges << e;
- }
-
- Qt3DCore::QSceneChangePtr lastChange() const
- {
- if (m_lastChanges.isEmpty())
- return Qt3DCore::QSceneChangePtr();
- return m_lastChanges.last();
- }
-
- QList<Qt3DCore::QSceneChangePtr> lastChanges() const
- {
- return m_lastChanges;
- }
-
- void notifyBackend(const Qt3DCore::QSceneChangePtr &e) final
- {
- m_sceneInterface->arbiter()->sceneChangeEventWithLock(e);
- }
-
- bool shouldNotifyFrontend(const Qt3DCore::QSceneChangePtr &)
- {
- return m_allowFrontendNotifications;
- }
-
-private:
- Qt3DCore::QScene *m_sceneInterface;
- QList<Qt3DCore::QSceneChangePtr> m_lastChanges;
- bool m_allowFrontendNotifications;
-};
-
-void tst_QChangeArbiter::registerObservers()
-{
- // GIVEN
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- Qt3DCore::QNode *root = new tst_Node();
- Qt3DCore::QNode *child = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- scene->addObservable(root);
-
- QList<tst_SimpleObserver *> observers;
- for (int i = 0; i < 5; i++) {
- tst_SimpleObserver *s = new tst_SimpleObserver();
- arbiter->registerObserver(s, root->id());
- observers << s;
- }
-
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- QVERIFY(o->lastChange().isNull());
-
- child->setParent(root);
- arbiter->syncChanges();
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QCOMPARE(o->lastChanges().size(), 1);
- QVERIFY(o->lastChanges().last()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::registerSceneObserver()
-{
- // GIVEN
- Qt3DCore::QComponent dummyComponent;
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNode *child = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- Qt3DCore::QNodePrivate::get(root)->m_hasBackendNode = true;
- scene->addObservable(root);
-
- QList<tst_SimpleObserver *> observers;
- for (int i = 0; i < 5; i++) {
- tst_SimpleObserver *s = new tst_SimpleObserver();
- arbiter->registerObserver(s, root->id());
- observers << s;
- }
-
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- QVERIFY(o->lastChange().isNull());
-
- // WHEN
- child->setParent(root);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- // WHEN
- root->sendComponentAddedNotification(&dummyComponent);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::ComponentAdded);
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::unregisterObservers()
-{
- // GIVEN
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNode *child = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- scene->addObservable(root);
-
- QList<tst_SimpleObserver *> observers;
- for (int i = 0; i < 5; i++) {
- tst_SimpleObserver *s = new tst_SimpleObserver();
- arbiter->registerObserver(s, root->id());
- observers << s;
- }
-
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- QVERIFY(o->lastChange().isNull());
-
- // WHEN
- child->setParent(root);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- // WHEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- arbiter->unregisterObserver(o, root->id());
-
- root->sendAllChangesNotification();
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::unregisterSceneObservers()
-{
- // GIVEN
- Qt3DCore::QComponent dummyComponent;
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNode *child = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- Qt3DCore::QNodePrivate::get(root)->m_hasBackendNode = true;
- Qt3DCore::QNodePrivate::get(child)->m_hasBackendNode = true;
- scene->addObservable(root);
-
- QList<tst_SimpleObserver *> observers;
- for (int i = 0; i < 5; i++) {
- tst_SimpleObserver *s = new tst_SimpleObserver();
- arbiter->registerObserver(s, root->id());
- observers << s;
- }
-
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers))
- QVERIFY(o->lastChange().isNull());
-
- // WHEN
- child->setParent(root);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- // WHEN
- root->sendComponentAddedNotification(&dummyComponent);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::ComponentAdded);
- }
-
- // WHEN
- child->setParent(Q_NODE_NULLPTR);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueRemoved);
- }
-
- // WHEN
- child->setParent(root);
- arbiter->syncChanges();
-
- // THEN
- for (tst_SimpleObserver *o : qAsConst(observers)) {
- QVERIFY(!o->lastChange().isNull());
- QVERIFY(o->lastChange()->type() == Qt3DCore::PropertyValueAdded);
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::distributeFrontendChanges()
-{
- // GIVEN
- Qt3DCore::QComponent dummyComponent;
- Qt3DCore::QNode dummyNode;
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- scene->addObservable(root);
-
- tst_SimpleObserver *backendAllChangedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendNodeAddedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendNodeRemovedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendNodeUpdatedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendComponentAddedObserver = new tst_SimpleObserver();
- tst_SimpleObserver *backendComponentRemovedObserver = new tst_SimpleObserver();
-
- arbiter->registerObserver(backendAllChangedObserver, root->id());
- arbiter->registerObserver(backendNodeAddedObserver, root->id(), Qt3DCore::PropertyValueAdded);
- arbiter->registerObserver(backendNodeUpdatedObserver, root->id(), Qt3DCore::PropertyUpdated);
- arbiter->registerObserver(backendNodeRemovedObserver, root->id(), Qt3DCore::PropertyValueRemoved);
- arbiter->registerObserver(backendComponentAddedObserver, root->id(), Qt3DCore::ComponentAdded);
- arbiter->registerObserver(backendComponentRemovedObserver, root->id(), Qt3DCore::ComponentRemoved);
-
- arbiter->syncChanges();
-
- // THEN
- QVERIFY(backendAllChangedObserver->lastChange().isNull());
- QVERIFY(backendNodeAddedObserver->lastChange().isNull());
- QVERIFY(backendNodeUpdatedObserver->lastChange().isNull());
- QVERIFY(backendNodeRemovedObserver->lastChange().isNull());
- QVERIFY(backendComponentAddedObserver->lastChange().isNull());
- QVERIFY(backendComponentRemovedObserver->lastChange().isNull());
-
- // WHEN
- root->sendNodeAddedNotification(&dummyNode);
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 0);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 0);
-
- // WHEN
- root->sendNodeUpdatedNotification();
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 2);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 0);
-
- // WHEN
- root->sendNodeRemovedNotification(&dummyNode);
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 3);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 0);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 0);
-
- // WHEN
- root->sendComponentAddedNotification(&dummyComponent);
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 4);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 0);
-
- // WHEN
- root->sendComponentRemovedNotification(&dummyComponent);
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 5);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 1);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 1);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 1);
-
- // WHEN
- root->sendAllChangesNotification();
- arbiter->syncChanges();
-
- // THEN
- QCOMPARE(backendAllChangedObserver->lastChanges().count(), 6);
- QCOMPARE(backendNodeAddedObserver->lastChanges().count(), 2);
- QCOMPARE(backendNodeUpdatedObserver->lastChanges().count(), 2);
- QCOMPARE(backendNodeRemovedObserver->lastChanges().count(), 2);
- QCOMPARE(backendComponentAddedObserver->lastChanges().count(), 2);
- QCOMPARE(backendComponentRemovedObserver->lastChanges().count(), 2);
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::distributePropertyChanges()
+void tst_QChangeArbiter::recordsDirtyNodes()
{
// GIVEN
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
+ QScopedPointer<TestArbiter> arbiter(new TestArbiter());
QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<Qt3DCore::QAbstractPostman> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
+// arbiter->setScene(scene.data());
scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // Test change notifications made to the root node:
// WHEN
- PropertyTestNode *root = new PropertyTestNode();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- Qt3DCore::QNodePrivate::get(root)->m_hasBackendNode = true;
- scene->addObservable(root);
+ auto *root = new PropertyTestNode();
+ auto *child = new PropertyTestNode(root);
- tst_SimpleObserver *rootObserver = new tst_SimpleObserver();
- arbiter->registerObserver(rootObserver, root->id());
- arbiter->syncChanges();
+ root->setProp1(883);
+ child->setProp2(1584);
// THEN
- QVERIFY(rootObserver->lastChange().isNull());
+ QCOMPARE(arbiter->dirtyNodes.size(), 0);
// WHEN
- root->setProp1(root->prop1() + 1);
+ Qt3DCore::QNodePrivate::get(root)->setArbiter(arbiter.data());
+ root->setProp1(884);
+ child->setProp2(1585);
// THEN
- auto dirtyNodes = arbiter->takeDirtyFrontEndNodes();
- QCOMPARE(dirtyNodes.size(), 1);
- QCOMPARE(dirtyNodes.front(), root);
+ QCOMPARE(arbiter->dirtyNodes.size(), 1);
+ QCOMPARE(arbiter->dirtyNodes.front(), root);
- // WHEN
- root->setProp2(root->prop2() + 1.f);
-
- // THEN
- dirtyNodes = arbiter->takeDirtyFrontEndNodes();
- QCOMPARE(dirtyNodes.size(), 1);
- QCOMPARE(dirtyNodes.front(), root);
-
- // Test change notifications made to an entity that was added to the scene
- // via QNode::setParent()
+ arbiter->dirtyNodes.clear();
// WHEN
- PropertyTestNode *setParentChild = new PropertyTestNode();
- setParentChild->setParent(root);
- tst_SimpleObserver *setParentChildObserver = new tst_SimpleObserver();
- arbiter->registerObserver(setParentChildObserver, setParentChild->id());
- setParentChild->setProp2(setParentChild->prop2() + 1.f);
+ Qt3DCore::QNodePrivate::get(child)->setArbiter(arbiter.data());
+ child->setProp2(1586);
// THEN
- dirtyNodes = arbiter->takeDirtyFrontEndNodes();
- QCOMPARE(dirtyNodes.size(), 1);
- QCOMPARE(dirtyNodes.front(), setParentChild);
+ QCOMPARE(arbiter->dirtyNodes.size(), 1);
+ QCOMPARE(arbiter->dirtyNodes.front(), child);
- // Test change notifications made to an entity that was added to the scene
- // via the QNode() constructor parent parameter
+ arbiter->dirtyNodes.clear();
// WHEN
- PropertyTestNode *directChild = new PropertyTestNode(root);
- QCoreApplication::processEvents(); // make sure the post-ctor initialization is executed for the node
- tst_SimpleObserver *directChildObserver = new tst_SimpleObserver();
- arbiter->registerObserver(directChildObserver, directChild->id());
- directChild->setProp1(directChild->prop1() + 1);
-
- // THEN
- dirtyNodes = arbiter->takeDirtyFrontEndNodes();
- QCOMPARE(dirtyNodes.size(), 1);
- QCOMPARE(dirtyNodes.front(), directChild);
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
-}
-
-void tst_QChangeArbiter::distributeBackendChanges()
-{
-
- // GIVEN
- QScopedPointer<Qt3DCore::QChangeArbiter> arbiter(new Qt3DCore::QChangeArbiter());
- QScopedPointer<Qt3DCore::QScene> scene(new Qt3DCore::QScene());
- QScopedPointer<tst_PostManObserver> postman(new tst_PostManObserver);
- arbiter->setPostman(postman.data());
- arbiter->setScene(scene.data());
- postman->setScene(scene.data());
- scene->setArbiter(arbiter.data());
- // Replaces initialize as we have no JobManager in this case
- Qt3DCore::QChangeArbiter::createThreadLocalChangeQueue(arbiter.data());
-
- // In order for backend -> frontend changes to work properly,
- // the backend notification should only be sent
- // from a worker thread which has a dedicated ChangeQueue in the
- // ChangeArbiter different than the frontend ChangeQueue. In this
- // test we will only check that the backend has received the frontend notification
-
-
- // WHEN
- tst_Node *root = new tst_Node();
- Qt3DCore::QNodePrivate::get(root)->setScene(scene.data());
- Qt3DCore::QNodePrivate::get(root)->m_hasBackendNode = true;
- scene->addObservable(root);
-
- tst_BackendObserverObservable *backenObserverObservable = new tst_BackendObserverObservable();
- arbiter->registerObserver(Qt3DCore::QBackendNodePrivate::get(backenObserverObservable), root->id());
- arbiter->scene()->addObservable(Qt3DCore::QBackendNodePrivate::get(backenObserverObservable), root->id());
- Qt3DCore::QBackendNodePrivate::get(backenObserverObservable)->setArbiter(arbiter.data());
-
- arbiter->syncChanges();
+ root->setProp1(887);
+ child->setProp2(1587);
// THEN
- QVERIFY(root->lastChange().isNull());
- QVERIFY(backenObserverObservable->lastChange().isNull());
- QCOMPARE(backenObserverObservable->lastChanges().count(), 0);
-
- // WHEN
- root->sendAllChangesNotification();
- arbiter->syncChanges();
-
- // THEN
- // backend observer receives event from frontend node "root"
- QCOMPARE(root->lastChanges().count(), 0);
- QCOMPARE(postman->lastChanges().count(), 0);
- QTRY_COMPARE(backenObserverObservable->lastChanges().count(), 1);
-
- backenObserverObservable->clear();
-
- {
- // WHEN
- // simulate a worker thread
- QScopedPointer<ThreadedAnswer> answer(new ThreadedAnswer(arbiter.data(), backenObserverObservable));
- postman->setAllowFrontendNotifications(false);
- QWaitCondition *waitingForBackendReplyCondition = answer->waitingCondition();
-
- QMutex mutex;
- // sends reply from another thread (simulates job thread)
- answer->start();
- mutex.lock();
- waitingForBackendReplyCondition->wait(&mutex);
- mutex.unlock();
-
- // To verify that backendObserver sent a reply
- arbiter->syncChanges();
-
- // THEN
- // the repliers should receive it's reply
- QTRY_COMPARE(backenObserverObservable->lastChanges().count(), 1);
- // verify that postMan has received the change
- QCOMPARE(postman->lastChanges().count(), 0);
- answer->exit();
- answer->wait();
- backenObserverObservable->clear();
- }
-
- {
- // WHEN
- // simulate a worker thread
- QScopedPointer<ThreadedAnswer> answer(new ThreadedAnswer(arbiter.data(), backenObserverObservable));
- postman->setAllowFrontendNotifications(true);
- QWaitCondition *waitingForBackendReplyCondition = answer->waitingCondition();
- QMutex mutex;
- // sends reply from another thread (simulates job thread)
- answer->start();
- mutex.lock();
- waitingForBackendReplyCondition->wait(&mutex);
- mutex.unlock();
-
- // To verify that backendObserver sent a reply
- arbiter->syncChanges();
-
- // THEN
- // the repliers should receive it's reply
- QTRY_COMPARE(backenObserverObservable->lastChanges().count(), 1);
- // verify that postMan has received the change
- QCOMPARE(postman->lastChanges().count(), 1);
-
- // verify correctness of the reply
- Qt3DCore::QPropertyUpdatedChangePtr c = qSharedPointerDynamicCast<Qt3DCore::QPropertyUpdatedChange>(postman->lastChange());
- QVERIFY(!c.isNull());
- QVERIFY(c->subjectId() == root->id());
- qDebug() << c->propertyName();
- QVERIFY(strcmp(c->propertyName(), "Reply") == 0);
- QVERIFY(c->type() == Qt3DCore::PropertyUpdated);
- answer->exit();
- answer->wait();
- }
-
- Qt3DCore::QChangeArbiter::destroyThreadLocalChangeQueue(arbiter.data());
+ QCOMPARE(arbiter->dirtyNodes.size(), 2);
}
QTEST_MAIN(tst_QChangeArbiter)