File indexing completed on 2024-05-19 05:34:39
0001 /* 0002 This file is part of the test suite of the Qt Toolkit. 0003 SPDX-FileCopyrightText: 2014 Digia Plc and/or its subsidiary(-ies) <http://www.qt-project.org/legal> 0004 0005 SPDX-License-Identifier: LGPL-2.1-only WITH Qt-LGPL-exception-1.1 OR LGPL-3.0-only WITH Qt-LGPL-exception-1.1 OR LicenseRef-Qt-Commercial 0006 */ 0007 0008 #include <QDebug> 0009 #include <QQmlComponent> 0010 #include <QQmlContext> 0011 #include <QQmlEngine> 0012 #include <QQuickItem> 0013 #include <QQuickView> 0014 #include <QSignalSpy> 0015 #include <QTest> 0016 #include <QWindow> 0017 #include <QtTest/qtestcase.h> 0018 #include <quickviewsharedengine.h> 0019 0020 class QQmlDataTest : public QObject 0021 { 0022 Q_OBJECT 0023 public: 0024 QQmlDataTest() 0025 { 0026 } 0027 0028 QString testFile(const QString &fileName) const 0029 { 0030 if (m_directory.isEmpty()) { 0031 qFatal("QQmlDataTest::initTestCase() not called."); 0032 } 0033 QString result = m_dataDirectory; 0034 result += QLatin1Char('/'); 0035 result += fileName; 0036 return result; 0037 } 0038 inline QString testFile(const char *fileName) const 0039 { 0040 return testFile(QLatin1String(fileName)); 0041 } 0042 inline QUrl testFileUrl(const QString &fileName) const 0043 { 0044 return QUrl::fromLocalFile(testFile(fileName)); 0045 } 0046 inline QUrl testFileUrl(const char *fileName) const 0047 { 0048 return testFileUrl(QLatin1String(fileName)); 0049 } 0050 0051 inline QString dataDirectory() const 0052 { 0053 return m_dataDirectory; 0054 } 0055 inline QUrl dataDirectoryUrl() const 0056 { 0057 return m_dataDirectoryUrl; 0058 } 0059 inline QString directory() const 0060 { 0061 return m_directory; 0062 } 0063 0064 static QByteArray msgComponentError(const QQmlComponent &, const QQmlEngine *engine = nullptr); 0065 0066 public Q_SLOTS: 0067 virtual void initTestCase() 0068 { 0069 QVERIFY2(!m_dataDirectory.isEmpty(), "'input' directory not found"); 0070 m_directory = QFileInfo(m_dataDirectory).absolutePath(); 0071 QVERIFY2(QDir::setCurrent(m_directory), qPrintable(QLatin1String("Could not chdir to ") + m_directory)); 0072 } 0073 0074 private: 0075 static QQmlDataTest *m_instance; 0076 0077 const QString m_dataDirectory = QFINDTESTDATA("input"); 0078 const QUrl m_dataDirectoryUrl = QUrl::fromLocalFile(m_dataDirectory + QLatin1Char('/')); 0079 0080 QString m_directory; 0081 }; 0082 0083 class QuickViewSharedEngineTest : public QQmlDataTest 0084 { 0085 Q_OBJECT 0086 public: 0087 QuickViewSharedEngineTest(); 0088 0089 private Q_SLOTS: 0090 void resizemodeitem(); 0091 void errors(); 0092 void engine(); 0093 }; 0094 0095 QuickViewSharedEngineTest::QuickViewSharedEngineTest() 0096 { 0097 } 0098 0099 void QuickViewSharedEngineTest::resizemodeitem() 0100 { 0101 QWindow window; 0102 window.setGeometry(0, 0, 400, 400); 0103 0104 auto view = new PlasmaQuick::QuickViewSharedEngine(&window); 0105 QVERIFY(view); 0106 view->setResizeMode(PlasmaQuick::QuickViewSharedEngine::SizeRootObjectToView); 0107 QCOMPARE(QSize(0, 0), view->initialSize()); 0108 view->setSource(testFileUrl("resizemodeitem.qml")); 0109 QQuickItem *item = qobject_cast<QQuickItem *>(view->rootObject()); 0110 QVERIFY(item); 0111 window.show(); 0112 0113 view->showNormal(); 0114 0115 // initial size from root object 0116 QCOMPARE(item->width(), 200.0); 0117 QCOMPARE(item->height(), 200.0); 0118 QCOMPARE(view->size(), QSize(200, 200)); 0119 QCOMPARE(view->size(), view->sizeHint()); 0120 QCOMPARE(view->size(), view->initialSize()); 0121 0122 // size update from view 0123 view->resize(QSize(80, 100)); 0124 0125 QTRY_COMPARE(item->width(), 80.0); 0126 QCOMPARE(item->height(), 100.0); 0127 QCOMPARE(view->size(), QSize(80, 100)); 0128 QCOMPARE(view->size(), view->sizeHint()); 0129 0130 view->setResizeMode(PlasmaQuick::QuickViewSharedEngine::SizeViewToRootObject); 0131 0132 // size update from view disabled 0133 view->resize(QSize(60, 80)); 0134 QCOMPARE(item->width(), 80.0); 0135 QCOMPARE(item->height(), 100.0); 0136 QTest::qWait(50); 0137 QCOMPARE(view->size(), QSize(60, 80)); 0138 0139 // size update from root object 0140 item->setWidth(250); 0141 item->setHeight(350); 0142 QCOMPARE(item->width(), 250.0); 0143 QCOMPARE(item->height(), 350.0); 0144 QTRY_COMPARE(view->size(), QSize(250, 350)); 0145 QCOMPARE(view->size(), QSize(250, 350)); 0146 QCOMPARE(view->size(), view->sizeHint()); 0147 0148 // reset window 0149 window.hide(); 0150 delete view; 0151 view = new PlasmaQuick::QuickViewSharedEngine(&window); 0152 QVERIFY(view); 0153 view->setResizeMode(PlasmaQuick::QuickViewSharedEngine::SizeViewToRootObject); 0154 view->setSource(testFileUrl("resizemodeitem.qml")); 0155 item = qobject_cast<QQuickItem *>(view->rootObject()); 0156 QVERIFY(item); 0157 window.show(); 0158 0159 view->showNormal(); 0160 0161 // initial size for root object 0162 QCOMPARE(item->width(), 200.0); 0163 QCOMPARE(item->height(), 200.0); 0164 QCOMPARE(view->size(), view->sizeHint()); 0165 QCOMPARE(view->size(), view->initialSize()); 0166 0167 // size update from root object 0168 item->setWidth(80); 0169 item->setHeight(100); 0170 QCOMPARE(item->width(), 80.0); 0171 QCOMPARE(item->height(), 100.0); 0172 QTRY_COMPARE(view->size(), QSize(80, 100)); 0173 QCOMPARE(view->size(), QSize(80, 100)); 0174 QCOMPARE(view->size(), view->sizeHint()); 0175 0176 // size update from root object disabled 0177 view->setResizeMode(PlasmaQuick::QuickViewSharedEngine::SizeRootObjectToView); 0178 item->setWidth(60); 0179 item->setHeight(80); 0180 QCOMPARE(view->width(), 80); 0181 QCOMPARE(view->height(), 100); 0182 QCOMPARE(QSize(item->width(), item->height()), view->sizeHint()); 0183 0184 // size update from view 0185 view->resize(QSize(200, 300)); 0186 QTRY_COMPARE(item->width(), 200.0); 0187 QCOMPARE(item->height(), 300.0); 0188 QCOMPARE(view->size(), QSize(200, 300)); 0189 QCOMPARE(view->size(), view->sizeHint()); 0190 0191 delete view; 0192 0193 // if we set a specific size for the view then it should keep that size 0194 // for SizeRootObjectToView mode. 0195 view = new PlasmaQuick::QuickViewSharedEngine(&window); 0196 view->resize(300, 300); 0197 view->setResizeMode(PlasmaQuick::QuickViewSharedEngine::SizeRootObjectToView); 0198 QCOMPARE(QSize(0, 0), view->initialSize()); 0199 view->setSource(testFileUrl("resizemodeitem.qml")); 0200 qWarning() << "bbb" << view->size(); 0201 view->resize(300, 300); 0202 qWarning() << "ccc" << view->size(); 0203 item = qobject_cast<QQuickItem *>(view->rootObject()); 0204 QVERIFY(item); 0205 0206 view->showNormal(); 0207 QTest::qWait(50); 0208 0209 // initial size from root object 0210 QCOMPARE(item->width(), 300.0); 0211 QCOMPARE(item->height(), 300.0); 0212 QCOMPARE(view->size(), QSize(300, 300)); 0213 QCOMPARE(view->size(), view->sizeHint()); 0214 QCOMPARE(view->initialSize(), QSize(200, 200)); // initial object size 0215 0216 delete view; 0217 } 0218 0219 QStringList messages; 0220 void messageHandler(QtMsgType, const QMessageLogContext &, const QString &message) 0221 { 0222 messages.append(message); 0223 }; 0224 void QuickViewSharedEngineTest::errors() 0225 { 0226 qInstallMessageHandler(messageHandler); 0227 0228 auto view = new PlasmaQuick::QuickViewSharedEngine; 0229 QVERIFY(view); 0230 view->setSource(testFileUrl("error1.qml")); 0231 QCOMPARE(view->status(), QQmlComponent::Error); 0232 QVERIFY(messages.count() >= 1); 0233 delete view; 0234 } 0235 0236 void QuickViewSharedEngineTest::engine() 0237 { 0238 // test if engines are actually shared 0239 // test if the engine gets deleted when the last view dies 0240 auto view = new PlasmaQuick::QuickViewSharedEngine(); 0241 QQmlEngine *engine = view->engine().get(); 0242 0243 auto view2 = new PlasmaQuick::QuickViewSharedEngine(); 0244 QQmlEngine *engine2 = view2->engine().get(); 0245 0246 QCOMPARE(engine, engine2); 0247 QSignalSpy engineDestroyedSpy(engine, &QObject::destroyed); 0248 0249 delete view; 0250 delete view2; 0251 0252 QCOMPARE(engineDestroyedSpy.count(), 1); 0253 } 0254 0255 QTEST_MAIN(QuickViewSharedEngineTest) 0256 0257 #include "quickviewsharedenginetest.moc"