From c8531f512eda3074aa66d8a5c7f9525b3be7f75d Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Fri, 26 Aug 2016 10:25:01 +0200 Subject: Add unit tests for LoadSceneJob Change-Id: I6a570f16a303277b8305b36bef805991680ae1ea Reviewed-by: Sean Harmer --- tests/auto/render/loadscenejob/loadscenejob.pro | 12 + .../auto/render/loadscenejob/tst_loadscenejob.cpp | 287 +++++++++++++++++++++ tests/auto/render/render.pro | 3 +- 3 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 tests/auto/render/loadscenejob/loadscenejob.pro create mode 100644 tests/auto/render/loadscenejob/tst_loadscenejob.cpp diff --git a/tests/auto/render/loadscenejob/loadscenejob.pro b/tests/auto/render/loadscenejob/loadscenejob.pro new file mode 100644 index 000000000..3901c3545 --- /dev/null +++ b/tests/auto/render/loadscenejob/loadscenejob.pro @@ -0,0 +1,12 @@ +TEMPLATE = app + +TARGET = tst_loadscenejob + +QT += 3dcore 3dcore-private 3drender 3drender-private testlib + +CONFIG += testcase + +SOURCES += tst_loadscenejob.cpp + +include(../../core/common/common.pri) +include(../commons/commons.pri) diff --git a/tests/auto/render/loadscenejob/tst_loadscenejob.cpp b/tests/auto/render/loadscenejob/tst_loadscenejob.cpp new file mode 100644 index 000000000..3428ecbea --- /dev/null +++ b/tests/auto/render/loadscenejob/tst_loadscenejob.cpp @@ -0,0 +1,287 @@ +/**************************************************************************** +** +** Copyright (C) 2016 Paul Lemire +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "testpostmanarbiter.h" + +class TestIOSceneHandler : public Qt3DRender::QSceneIOHandler +{ +public: + explicit TestIOSceneHandler(bool supportsFormat, bool shouldFail) + : m_supportsFormat(supportsFormat) + , m_shouldFail(shouldFail) + {} + + void setSource(const QUrl &source) Q_DECL_OVERRIDE + { + m_source = source; + } + + bool isFileTypeSupported(const QUrl &) const Q_DECL_OVERRIDE + { + return m_supportsFormat; + } + + Qt3DCore::QEntity *scene(const QString &) Q_DECL_OVERRIDE + { + return m_shouldFail ? nullptr : new Qt3DCore::QEntity(); + } + + Qt3DCore::QEntity *node(const QString &) Q_DECL_OVERRIDE + { + return m_shouldFail ? nullptr : new Qt3DCore::QEntity(); + } + + QUrl source() const + { + return m_source; + } + +private: + QUrl m_source; + bool m_supportsFormat; + bool m_shouldFail; +}; + +class tst_LoadSceneJob : public QObject +{ + Q_OBJECT + +private Q_SLOTS: + + void checkInitialState() + { + // GIVEN + QUrl url; + Qt3DCore::QNodeId nodeId; + Qt3DRender::Render::LoadSceneJob backendLoadSceneJob(url, nodeId); + + // THEN + QCOMPARE(backendLoadSceneJob.source(), url); + QCOMPARE(backendLoadSceneJob.sceneComponentId(), nodeId); + QVERIFY(backendLoadSceneJob.nodeManagers() == nullptr); + QCOMPARE(backendLoadSceneJob.sceneIOHandlers().size(), 0); + } + + void checkInitialize() + { + // GIVEN + const QUrl url(QStringLiteral("URL")); + const Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId(); + Qt3DRender::Render::NodeManagers nodeManagers; + TestIOSceneHandler fakeHandler(true, true); + + // WHEN + Qt3DRender::Render::LoadSceneJob backendLoadSceneJob(url, sceneId); + backendLoadSceneJob.setNodeManagers(&nodeManagers); + backendLoadSceneJob.setSceneIOHandlers(QList() << &fakeHandler); + + // THEN + QCOMPARE(backendLoadSceneJob.source(), url); + QCOMPARE(backendLoadSceneJob.sceneComponentId(), sceneId); + QVERIFY(backendLoadSceneJob.nodeManagers() == &nodeManagers); + QCOMPARE(backendLoadSceneJob.sceneIOHandlers().size(), 1); + QCOMPARE(backendLoadSceneJob.sceneIOHandlers().first(), &fakeHandler); + } + + void checkRunValidSourceSupportedFormat() + { + // GIVEN + const QUrl url(QStringLiteral("URL")); + TestArbiter arbiter; + Qt3DRender::Render::NodeManagers nodeManagers; + TestIOSceneHandler fakeHandler(true, false); + Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId(); + Qt3DRender::Render::Scene *scene = nodeManagers.sceneManager()->getOrCreateResource(sceneId); + + // THEN + QVERIFY(scene != nullptr); + Qt3DCore::QBackendNodePrivate::get(scene)->setArbiter(&arbiter); + + // WHEN + Qt3DRender::Render::LoadSceneJob loadSceneJob(url, sceneId); + loadSceneJob.setNodeManagers(&nodeManagers); + loadSceneJob.setSceneIOHandlers(QList() << &fakeHandler); + loadSceneJob.run(); + + // THEN + QCOMPARE(arbiter.events.count(), 4); + auto change = arbiter.events.at(0).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::None); + + change = arbiter.events.at(1).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::Loading); + + change = arbiter.events.at(2).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "scene"); + QVERIFY(change->value().value() != nullptr); + delete change->value().value(); + + change = arbiter.events.at(3).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::Ready); + } + + void checkEmptySource() + { + // GIVEN + QUrl url; + TestArbiter arbiter; + Qt3DRender::Render::NodeManagers nodeManagers; + TestIOSceneHandler fakeHandler(true, false); + Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId(); + Qt3DRender::Render::Scene *scene = nodeManagers.sceneManager()->getOrCreateResource(sceneId); + + // THEN + QVERIFY(scene != nullptr); + Qt3DCore::QBackendNodePrivate::get(scene)->setArbiter(&arbiter); + + // WHEN + Qt3DRender::Render::LoadSceneJob loadSceneJob(url, sceneId); + loadSceneJob.setNodeManagers(&nodeManagers); + loadSceneJob.setSceneIOHandlers(QList() << &fakeHandler); + loadSceneJob.run(); + + // THEN + QCOMPARE(arbiter.events.count(), 3); + auto change = arbiter.events.at(0).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::None); + + change = arbiter.events.at(1).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "scene"); + QVERIFY(change->value().value() == nullptr); + + change = arbiter.events.at(2).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::None); + } + + void checkRunValidSourceUnsupportedFormat() + { + // GIVEN + const QUrl url(QStringLiteral("URL")); + TestArbiter arbiter; + Qt3DRender::Render::NodeManagers nodeManagers; + TestIOSceneHandler fakeHandler(false, false); + Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId(); + Qt3DRender::Render::Scene *scene = nodeManagers.sceneManager()->getOrCreateResource(sceneId); + + // THEN + QVERIFY(scene != nullptr); + Qt3DCore::QBackendNodePrivate::get(scene)->setArbiter(&arbiter); + + // WHEN + Qt3DRender::Render::LoadSceneJob loadSceneJob(url, sceneId); + loadSceneJob.setNodeManagers(&nodeManagers); + loadSceneJob.setSceneIOHandlers(QList() << &fakeHandler); + loadSceneJob.run(); + + // THEN + QCOMPARE(arbiter.events.count(), 3); + auto change = arbiter.events.at(0).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::None); + + change = arbiter.events.at(1).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "scene"); + QVERIFY(change->value().value() == nullptr); + + change = arbiter.events.at(2).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::Error); + } + + void checkRunErrorAtLoading() + { + // GIVEN + const QUrl url(QStringLiteral("URL")); + TestArbiter arbiter; + Qt3DRender::Render::NodeManagers nodeManagers; + TestIOSceneHandler fakeHandler(true, true); + Qt3DCore::QNodeId sceneId = Qt3DCore::QNodeId::createId(); + Qt3DRender::Render::Scene *scene = nodeManagers.sceneManager()->getOrCreateResource(sceneId); + + // THEN + QVERIFY(scene != nullptr); + Qt3DCore::QBackendNodePrivate::get(scene)->setArbiter(&arbiter); + + // WHEN + Qt3DRender::Render::LoadSceneJob loadSceneJob(url, sceneId); + loadSceneJob.setNodeManagers(&nodeManagers); + loadSceneJob.setSceneIOHandlers(QList() << &fakeHandler); + loadSceneJob.run(); + + // THEN + QCOMPARE(arbiter.events.count(), 4); + auto change = arbiter.events.at(0).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::None); + + change = arbiter.events.at(1).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::Loading); + + change = arbiter.events.at(2).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "scene"); + QVERIFY(change->value().value() == nullptr); + delete change->value().value(); + + change = arbiter.events.at(3).staticCast(); + QCOMPARE(change->subjectId(), scene->peerId()); + QCOMPARE(change->propertyName(), "status"); + QCOMPARE(change->value().value(), Qt3DRender::QSceneLoader::Error); + } +}; + +QTEST_MAIN(tst_LoadSceneJob) + +#include "tst_loadscenejob.moc" diff --git a/tests/auto/render/render.pro b/tests/auto/render/render.pro index d86e73c96..9c91e0c6e 100644 --- a/tests/auto/render/render.pro +++ b/tests/auto/render/render.pro @@ -56,5 +56,6 @@ contains(QT_CONFIG, private_tests) { qsceneloader \ qrendertargetoutput \ qcameralens \ - qcomputecommand + qcomputecommand \ + loadscenejob } -- cgit v1.2.3