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"