File indexing completed on 2024-05-05 16:07:08

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 "util.h"
0009 #include <QDebug>
0010 #include <QQmlComponent>
0011 #include <QQmlContext>
0012 #include <QQmlEngine>
0013 #include <QQuickItem>
0014 #include <QQuickView>
0015 #include <QSignalSpy>
0016 #include <QTest>
0017 #include <QWindow>
0018 #include <quickviewsharedengine.h>
0019 
0020 class QuickViewSharedEngineTest : public QQmlDataTest
0021 {
0022     Q_OBJECT
0023 public:
0024     QuickViewSharedEngineTest();
0025 
0026 private Q_SLOTS:
0027     void resizemodeitem();
0028     void errors();
0029     void engine();
0030 };
0031 
0032 QuickViewSharedEngineTest::QuickViewSharedEngineTest()
0033 {
0034 }
0035 
0036 void QuickViewSharedEngineTest::resizemodeitem()
0037 {
0038     QWindow window;
0039     window.setGeometry(0, 0, 400, 400);
0040 
0041     KQuickAddons::QuickViewSharedEngine *view = new KQuickAddons::QuickViewSharedEngine(&window);
0042     QVERIFY(view);
0043     view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeRootObjectToView);
0044     QCOMPARE(QSize(0, 0), view->initialSize());
0045     view->setSource(testFileUrl("resizemodeitem.qml"));
0046     QQuickItem *item = qobject_cast<QQuickItem *>(view->rootObject());
0047     QVERIFY(item);
0048     window.show();
0049 
0050     view->showNormal();
0051 
0052     // initial size from root object
0053     QCOMPARE(item->width(), 200.0);
0054     QCOMPARE(item->height(), 200.0);
0055     QCOMPARE(view->size(), QSize(200, 200));
0056     QCOMPARE(view->size(), view->sizeHint());
0057     QCOMPARE(view->size(), view->initialSize());
0058 
0059     // size update from view
0060     view->resize(QSize(80, 100));
0061 
0062     QTRY_COMPARE(item->width(), 80.0);
0063     QCOMPARE(item->height(), 100.0);
0064     QCOMPARE(view->size(), QSize(80, 100));
0065     QCOMPARE(view->size(), view->sizeHint());
0066 
0067     view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeViewToRootObject);
0068 
0069     // size update from view disabled
0070     view->resize(QSize(60, 80));
0071     QCOMPARE(item->width(), 80.0);
0072     QCOMPARE(item->height(), 100.0);
0073     QTest::qWait(50);
0074     QCOMPARE(view->size(), QSize(60, 80));
0075 
0076     // size update from root object
0077     item->setWidth(250);
0078     item->setHeight(350);
0079     QCOMPARE(item->width(), 250.0);
0080     QCOMPARE(item->height(), 350.0);
0081     QTRY_COMPARE(view->size(), QSize(250, 350));
0082     QCOMPARE(view->size(), QSize(250, 350));
0083     QCOMPARE(view->size(), view->sizeHint());
0084 
0085     // reset window
0086     window.hide();
0087     delete view;
0088     view = new KQuickAddons::QuickViewSharedEngine(&window);
0089     QVERIFY(view);
0090     view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeViewToRootObject);
0091     view->setSource(testFileUrl("resizemodeitem.qml"));
0092     item = qobject_cast<QQuickItem *>(view->rootObject());
0093     QVERIFY(item);
0094     window.show();
0095 
0096     view->showNormal();
0097 
0098     // initial size for root object
0099     QCOMPARE(item->width(), 200.0);
0100     QCOMPARE(item->height(), 200.0);
0101     QCOMPARE(view->size(), view->sizeHint());
0102     QCOMPARE(view->size(), view->initialSize());
0103 
0104     // size update from root object
0105     item->setWidth(80);
0106     item->setHeight(100);
0107     QCOMPARE(item->width(), 80.0);
0108     QCOMPARE(item->height(), 100.0);
0109     QTRY_COMPARE(view->size(), QSize(80, 100));
0110     QCOMPARE(view->size(), QSize(80, 100));
0111     QCOMPARE(view->size(), view->sizeHint());
0112 
0113     // size update from root object disabled
0114     view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeRootObjectToView);
0115     item->setWidth(60);
0116     item->setHeight(80);
0117     QCOMPARE(view->width(), 80);
0118     QCOMPARE(view->height(), 100);
0119     QCOMPARE(QSize(item->width(), item->height()), view->sizeHint());
0120 
0121     // size update from view
0122     view->resize(QSize(200, 300));
0123     QTRY_COMPARE(item->width(), 200.0);
0124     QCOMPARE(item->height(), 300.0);
0125     QCOMPARE(view->size(), QSize(200, 300));
0126     QCOMPARE(view->size(), view->sizeHint());
0127 
0128     delete view;
0129 
0130     // if we set a specific size for the view then it should keep that size
0131     // for SizeRootObjectToView mode.
0132     view = new KQuickAddons::QuickViewSharedEngine(&window);
0133     view->resize(300, 300);
0134     view->setResizeMode(KQuickAddons::QuickViewSharedEngine::SizeRootObjectToView);
0135     QCOMPARE(QSize(0, 0), view->initialSize());
0136     view->setSource(testFileUrl("resizemodeitem.qml"));
0137     qWarning() << "bbb" << view->size();
0138     view->resize(300, 300);
0139     qWarning() << "ccc" << view->size();
0140     item = qobject_cast<QQuickItem *>(view->rootObject());
0141     QVERIFY(item);
0142 
0143     view->showNormal();
0144     QTest::qWait(50);
0145 
0146     // initial size from root object
0147     QCOMPARE(item->width(), 300.0);
0148     QCOMPARE(item->height(), 300.0);
0149     QCOMPARE(view->size(), QSize(300, 300));
0150     QCOMPARE(view->size(), view->sizeHint());
0151     QCOMPARE(view->initialSize(), QSize(200, 200)); // initial object size
0152 
0153     delete view;
0154 }
0155 
0156 void QuickViewSharedEngineTest::errors()
0157 {
0158     KQuickAddons::QuickViewSharedEngine *view = new KQuickAddons::QuickViewSharedEngine;
0159     QVERIFY(view);
0160     QQmlTestMessageHandler messageHandler;
0161     view->setSource(testFileUrl("error1.qml"));
0162     QCOMPARE(view->status(), QQmlComponent::Error);
0163     QCOMPARE(view->errors().count(), 1);
0164     delete view;
0165 }
0166 
0167 void QuickViewSharedEngineTest::engine()
0168 {
0169     // test if engines are actually shared
0170     // test if the engine gets deleted when the last view dies
0171     KQuickAddons::QuickViewSharedEngine *view = new KQuickAddons::QuickViewSharedEngine();
0172     QQmlEngine *engine = view->engine();
0173 
0174     KQuickAddons::QuickViewSharedEngine *view2 = new KQuickAddons::QuickViewSharedEngine();
0175     QQmlEngine *engine2 = view2->engine();
0176 
0177     QCOMPARE(engine, engine2);
0178     QSignalSpy engineDestroyedSpy(engine, &QObject::destroyed);
0179 
0180     delete view;
0181     delete view2;
0182 
0183     QCOMPARE(engineDestroyedSpy.count(), 1);
0184 }
0185 
0186 QTEST_MAIN(QuickViewSharedEngineTest)
0187 
0188 #include "quickviewsharedengine.moc"