diff options
Diffstat (limited to 'tests/auto/quick/qquickview')
-rw-r--r-- | tests/auto/quick/qquickview/CMakeLists.txt | 16 | ||||
-rw-r--r-- | tests/auto/quick/qquickview/data/TestQml.qml | 3 | ||||
-rw-r--r-- | tests/auto/quick/qquickview/data/overlay.qml | 17 | ||||
-rw-r--r-- | tests/auto/quick/qquickview/tst_qquickview.cpp | 85 |
4 files changed, 120 insertions, 1 deletions
diff --git a/tests/auto/quick/qquickview/CMakeLists.txt b/tests/auto/quick/qquickview/CMakeLists.txt index d5d248481a..658d957de5 100644 --- a/tests/auto/quick/qquickview/CMakeLists.txt +++ b/tests/auto/quick/qquickview/CMakeLists.txt @@ -7,6 +7,14 @@ ## tst_qquickview Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qquickview LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + +qt_policy(SET QTP0001 NEW) + # Collect test data file(GLOB_RECURSE test_data_glob RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} @@ -26,6 +34,14 @@ qt_internal_add_test(tst_qquickview TESTDATA ${test_data} ) + +qt_add_qml_module( + tst_qquickview + URI test + QML_FILES + "data/TestQml.qml" +) + ## Scopes: ##################################################################### diff --git a/tests/auto/quick/qquickview/data/TestQml.qml b/tests/auto/quick/qquickview/data/TestQml.qml new file mode 100644 index 0000000000..3052615aef --- /dev/null +++ b/tests/auto/quick/qquickview/data/TestQml.qml @@ -0,0 +1,3 @@ +import QtQuick + +Item {} diff --git a/tests/auto/quick/qquickview/data/overlay.qml b/tests/auto/quick/qquickview/data/overlay.qml new file mode 100644 index 0000000000..cefaaed8bd --- /dev/null +++ b/tests/auto/quick/qquickview/data/overlay.qml @@ -0,0 +1,17 @@ +// RootItem.qml +import QtQuick +import QtQuick.Controls.Basic + +Item { + id: root + width: 640 + height: 480 + + property double scaleFactor: 2.0 + Scale { + id: scale + xScale: root.scaleFactor + yScale: root.scaleFactor + } + Overlay.overlay.transform: scale +} diff --git a/tests/auto/quick/qquickview/tst_qquickview.cpp b/tests/auto/quick/qquickview/tst_qquickview.cpp index e226cfdca7..91a45077fb 100644 --- a/tests/auto/quick/qquickview/tst_qquickview.cpp +++ b/tests/auto/quick/qquickview/tst_qquickview.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <qtest.h> #include <QtTest/QSignalSpy> #include <QtQml/qqmlcomponent.h> @@ -10,9 +10,13 @@ #include <QtGui/QWindow> #include <QtCore/QDebug> #include <QtQml/qqmlengine.h> +#include <private/qv4engine_p.h> +#include <private/qv4mm_p.h> #include <QtQuickTestUtils/private/geometrytestutils_p.h> +using namespace Qt::StringLiterals; + class tst_QQuickView : public QQmlDataTest { Q_OBJECT @@ -20,11 +24,16 @@ public: tst_QQuickView(); private slots: + void gc(); void resizemodeitem(); void errors(); void engine(); void findChild(); void setInitialProperties(); + void fromModuleCtor(); + void loadFromModule_data(); + void loadFromModule(); + void overlay(); }; @@ -33,6 +42,36 @@ tst_QQuickView::tst_QQuickView() { } +void tst_QQuickView::gc() +{ + QQuickView view; + QQmlEngine *engine = view.engine(); + QV4::ExecutionEngine *v4 = engine->handle(); + + v4->memoryManager->gcStateMachine->deadline = QDeadlineTimer(QDeadlineTimer::Forever); + auto sm = v4->memoryManager->gcStateMachine.get(); + sm->reset(); + while (sm->state != QV4::GCState::CallDestroyObjects) { + QV4::GCStateInfo& stateInfo = sm->stateInfoMap[int(sm->state)]; + sm->state = stateInfo.execute(sm, sm->stateData); + } + view.loadFromModule("test", "TestQml"); + auto root = view.rootObject(); + QVERIFY(root); + auto ddata = QQmlData::get(root, false); + while (sm->state != QV4::GCState::DoSweep) { + if (sm->state > QV4::GCState::InitCallDestroyObjects) { + sm->mm->collectFromJSStack(sm->mm->markStack()); + sm->mm->m_markStack->drain(); + } + QV4::GCStateInfo& stateInfo = sm->stateInfoMap[int(sm->state)]; + sm->state = stateInfo.execute(sm, sm->stateData); + } + QVERIFY(ddata); + QVERIFY(ddata->jsWrapper.asManaged()); + QVERIFY(ddata->jsWrapper.asManaged()->markBit()); +} + void tst_QQuickView::resizemodeitem() { QWindow window; @@ -270,6 +309,50 @@ void tst_QQuickView::setInitialProperties() QCOMPARE(rootObject->property("width").toInt(), 100); } +void tst_QQuickView::fromModuleCtor() +{ + QQuickView view("QtQuick", "Rectangle"); + // creation is always synchronous for C++ defined types, so we don't need _TRY + QObject *rootObject = view.rootObject(); + QVERIFY(rootObject); + QCOMPARE(rootObject->metaObject()->className(), "QQuickRectangle"); +} + +void tst_QQuickView::loadFromModule_data() +{ + QTest::addColumn<QString>("module"); + QTest::addColumn<QString>("typeName"); + QTest::addColumn<QUrl>("url"); + QTest::addColumn<QQuickView::Status>("status"); + + QTest::addRow("Item") << u"QtQuick"_s << u"Item"_s << QUrl() << QQuickView::Ready; + QTest::addRow("composite") << u"test"_s << u"TestQml"_s << QUrl("qrc:/qt/qml/test/data/TestQml.qml") << QQuickView::Ready; + QTest::addRow("nonexistent") << u"missing"_s << u"Type"_s << QUrl() << QQuickView::Error; +} + +void tst_QQuickView::loadFromModule() +{ + QFETCH(QString, module); + QFETCH(QString, typeName); + QFETCH(QUrl, url); + QFETCH(QQuickView::Status, status); + + QQuickView view; + view.loadFromModule(module, typeName); + QTRY_COMPARE(view.status(), status); + QCOMPARE(view.source(), url); +} + +void tst_QQuickView::overlay() +{ + QTest::ignoreMessage(QtWarningMsg, + QRegularExpression(".*: Cannot set properties on overlay as it is null")); + QQuickView view; + view.setSource(testFileUrl("overlay.qml")); + QObject *rootObject = view.rootObject(); + QVERIFY(!rootObject); +} + QTEST_MAIN(tst_QQuickView) #include "tst_qquickview.moc" |