// Copyright (C) 2015 Klaralvdalens Datakonsult AB (KDAB). // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include #include #include #include #include #include #include #include #include "testarbiter.h" class FakeGeometry : public Qt3DCore::QGeometry { Q_OBJECT }; class tst_QGeometry: public QObject { Q_OBJECT private Q_SLOTS: void checkPropertyUpdates() { // GIVEN TestArbiter arbiter; QScopedPointer geometry(new Qt3DCore::QGeometry()); arbiter.setArbiterOnNode(geometry.data()); // WHEN Qt3DCore::QAttribute attr; geometry->addAttribute(&attr); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.dirtyNodes().size(), 1); QCOMPARE(arbiter.dirtyNodes().front(), geometry.data()); arbiter.clear(); // WHEN geometry->addAttribute(&attr); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.dirtyNodes().size(), 0); // WHEN geometry->removeAttribute(&attr); QCoreApplication::processEvents(); // THEN QCOMPARE(arbiter.dirtyNodes().size(), 1); QCOMPARE(arbiter.dirtyNodes().front(), geometry.data()); } void checkAttributeBookkeeping() { // GIVEN QScopedPointer geometry(new Qt3DCore::QGeometry); { // WHEN Qt3DCore::QAttribute attribute; geometry->addAttribute(&attribute); // THEN QCOMPARE(attribute.parent(), geometry.data()); QCOMPARE(geometry->attributes().size(), 1); } // THEN (Should not crash and parameter be unset) QVERIFY(geometry->attributes().isEmpty()); { // WHEN Qt3DCore::QGeometry someOtherGeometry; QScopedPointer attribute(new Qt3DCore::QAttribute(&someOtherGeometry)); geometry->addAttribute(attribute.data()); // THEN QCOMPARE(attribute->parent(), &someOtherGeometry); QCOMPARE(geometry->attributes().size(), 1); // WHEN geometry.reset(); attribute.reset(); // THEN Should not crash when the attribute is destroyed (tests for failed removal of destruction helper) } } void checkExtentUpdates() { // GIVEN TestArbiter arbiter; QScopedPointer geometry(new FakeGeometry()); arbiter.setArbiterOnNode(geometry.data()); QSignalSpy spyMinExtent(geometry.data(), SIGNAL(minExtentChanged(QVector3D))); QSignalSpy spyMaxExtent(geometry.data(), SIGNAL(maxExtentChanged(QVector3D))); // THEN QVERIFY(spyMinExtent.isValid()); QVERIFY(spyMaxExtent.isValid()); QCOMPARE(geometry->minExtent(), QVector3D()); QCOMPARE(geometry->maxExtent(), QVector3D()); // WHEN auto dNode = static_cast(Qt3DCore::QNodePrivate::get(geometry.data())); const QVector3D minExt(-1.0f, -1.0f, -1.0f); const QVector3D maxExt(1.0f, 1.0f, 1.0f); dNode->setExtent(minExt, maxExt); // THEN QCOMPARE(spyMinExtent.size(), 1); QCOMPARE(spyMaxExtent.size(), 1); QCOMPARE(geometry->minExtent(), minExt); QCOMPARE(geometry->maxExtent(), maxExt); spyMaxExtent.clear(); spyMinExtent.clear(); // WHEN dNode->setExtent(minExt, maxExt); // THEN QCOMPARE(spyMinExtent.size(), 0); QCOMPARE(spyMaxExtent.size(), 0); } }; QTEST_MAIN(tst_QGeometry) #include "tst_qgeometry.moc"