File indexing completed on 2024-05-19 16:37:09

0001 /*
0002     SPDX-FileCopyrightText: 2016 David Rosca <nowrep@gmail.com>
0003     SPDX-FileCopyrightText: 2022 Fushan Wen <qydwhotmail@gmail.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include <QQmlComponent>
0009 #include <QQmlContext>
0010 #include <QQmlEngine>
0011 #include <QQuickItem>
0012 #include <QQuickItemGrabResult>
0013 #include <QQuickView>
0014 #include <QSignalSpy>
0015 #include <QTest>
0016 
0017 #include <KIconEngine>
0018 #include <KIconLoader>
0019 #include <KIconTheme>
0020 
0021 #include "plasma/svg.h"
0022 #include "plasma/theme.h"
0023 #include "utils.h"
0024 
0025 class IconItemHiDPITest : public QObject
0026 {
0027     Q_OBJECT
0028 
0029 private Q_SLOTS:
0030     void initTestCase();
0031     void cleanupTestCase();
0032     void init();
0033     void cleanup();
0034 
0035     void testScaleFactor();
0036 
0037 private:
0038     QQuickItem *createIconItem();
0039 
0040     QQuickView *m_view = nullptr;
0041 };
0042 
0043 void IconItemHiDPITest::initTestCase()
0044 {
0045     Plasma::TestUtils::installPlasmaTheme("breeze");
0046     Plasma::TestUtils::installPlasmaTheme("breeze-light");
0047     Plasma::TestUtils::installPlasmaTheme("breeze-dark");
0048 
0049     QVERIFY(qputenv("XDG_DATA_DIRS", QByteArray(qgetenv("XDG_DATA_DIRS") + ":" + QFINDTESTDATA("data").toLocal8Bit())));
0050 
0051     QIcon::setThemeSearchPaths({QFINDTESTDATA("data/icons")});
0052     QIcon::setThemeName("test-theme");
0053 
0054     KIconTheme::forceThemeForTests("test-theme");
0055     KIconTheme::reconfigure();
0056     KIconLoader::global()->reconfigure(QString());
0057 
0058     m_view = new QQuickView();
0059     m_view->setSource(QUrl::fromLocalFile(QFINDTESTDATA("data/view.qml")));
0060     m_view->show();
0061     QVERIFY(QTest::qWaitForWindowExposed(m_view));
0062 
0063     if (!m_view->rootObject() || !m_view->rootObject()->grabToImage()) {
0064         QSKIP("Cannot grab item to image.");
0065     }
0066 }
0067 
0068 void IconItemHiDPITest::cleanupTestCase()
0069 {
0070     delete m_view;
0071 }
0072 
0073 void IconItemHiDPITest::init()
0074 {
0075     Plasma::Theme().setThemeName(QStringLiteral("default"));
0076 }
0077 
0078 void IconItemHiDPITest::cleanup()
0079 {
0080     qDeleteAll(m_view->rootObject()->childItems());
0081 }
0082 
0083 QQuickItem *IconItemHiDPITest::createIconItem()
0084 {
0085     QByteArray iconQml =
0086         "import QtQuick 2.0;"
0087         "import org.kde.plasma.core 2.0 as PlasmaCore;"
0088         "PlasmaCore.IconItem {"
0089         "    id: root;"
0090         "}";
0091 
0092     QQmlComponent component(m_view->engine());
0093 
0094     QSignalSpy spy(&component, SIGNAL(statusChanged(QQmlComponent::Status)));
0095     component.setData(iconQml, QUrl("test://iconTest"));
0096     if (component.status() != QQmlComponent::Ready) {
0097         spy.wait();
0098     }
0099 
0100     QQuickItem *item = qobject_cast<QQuickItem *>(component.create(m_view->engine()->rootContext()));
0101     Q_ASSERT(item && qstrcmp(item->metaObject()->className(), "IconItem") == 0);
0102     item->setParentItem(m_view->rootObject());
0103     return item;
0104 }
0105 
0106 void IconItemHiDPITest::testScaleFactor()
0107 {
0108     QString name("tst-plasma-framework-test-icon");
0109 
0110     QQuickItem *item = createIconItem();
0111     item->setProperty("animated", false);
0112     item->setSize(QSize(64, 64));
0113     item->setProperty("source", name);
0114     QVERIFY(item->property("valid").toBool());
0115 
0116     Plasma::Svg *svg = item->findChild<Plasma::Svg *>();
0117     Q_ASSERT(svg);
0118     QCOMPARE(svg->imagePath(), QFINDTESTDATA("data/icons/test-theme/apps/32/" + name + ".svg"));
0119     if (m_view->devicePixelRatio() != 1.25) {
0120         qInfo() << m_view->devicePixelRatio();
0121         QSKIP("Can't test devicePixelRatio when system DPI is not 100%.");
0122     }
0123     QCOMPARE(svg->devicePixelRatio(), 2);
0124 }
0125 
0126 QTEST_MAIN(IconItemHiDPITest)
0127 
0128 #include "iconitemhidpitest.moc"