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

0001 /*
0002     SPDX-FileCopyrightText: 2014 Marco Martin <mart@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "coronatest.h"
0008 #include <KActionCollection>
0009 
0010 #include <QAction>
0011 #include <QApplication>
0012 #include <QProcess>
0013 #include <QRandomGenerator>
0014 #include <QSignalSpy>
0015 #include <QStandardPaths>
0016 
0017 SimpleCorona::SimpleCorona(QObject *parent)
0018     : Plasma::Corona(parent)
0019 {
0020 }
0021 
0022 SimpleCorona::~SimpleCorona()
0023 {
0024 }
0025 
0026 QRect SimpleCorona::screenGeometry(int screen) const
0027 {
0028     // completely arbitrary, still not tested
0029     return QRect(100 * screen, 100, 100, 100);
0030 }
0031 
0032 int SimpleCorona::screenForContainment(const Plasma::Containment *c) const
0033 {
0034     if (qobject_cast<const SimpleNoScreenContainment *>(c)) {
0035         return -1;
0036     }
0037     return 0;
0038 }
0039 
0040 SimpleApplet::SimpleApplet(QObject *parentObject, const KPluginMetaData &data, const QVariantList &args)
0041     : Plasma::Applet(parentObject, data, args)
0042 {
0043     // updateConstraints(Plasma::Types::UiReadyConstraint);
0044     m_timer.setSingleShot(true);
0045     m_timer.setInterval(QRandomGenerator::global()->bounded((500 + 1) - 100) + 100);
0046     m_timer.start();
0047     connect(&m_timer, &QTimer::timeout, [=]() {
0048         updateConstraints(Plasma::Types::UiReadyConstraint);
0049     });
0050 }
0051 
0052 SimpleContainment::SimpleContainment(QObject *parentObject, const KPluginMetaData &data, const QVariantList &args)
0053     : Plasma::Containment(parentObject, data, args)
0054 {
0055     // updateConstraints(Plasma::Types::UiReadyConstraint);
0056     m_timer.setSingleShot(true);
0057     m_timer.setInterval(QRandomGenerator::global()->bounded((500 + 1) - 100) + 100);
0058     m_timer.start();
0059     connect(&m_timer, &QTimer::timeout, [=]() {
0060         updateConstraints(Plasma::Types::UiReadyConstraint);
0061     });
0062 }
0063 
0064 SimpleNoScreenContainment::SimpleNoScreenContainment(QObject *parentObject, const KPluginMetaData &data, const QVariantList &args)
0065     : Plasma::Containment(parentObject, data, args)
0066 {
0067     // This containment will *never* be isUiReady()
0068 }
0069 
0070 void CoronaTest::initTestCase()
0071 {
0072     QStandardPaths::setTestModeEnabled(true);
0073     m_corona = new SimpleCorona;
0074 
0075     m_configDir = QDir(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation));
0076     m_configDir.removeRecursively();
0077 
0078     QVERIFY(m_configDir.mkpath(QStringLiteral(".")));
0079 
0080     QVERIFY(QFile::copy(QStringLiteral(":/plasma-test-appletsrc"), m_configDir.filePath(QStringLiteral("plasma-test-appletsrc"))));
0081 }
0082 
0083 void CoronaTest::cleanupTestCase()
0084 {
0085     m_configDir.removeRecursively();
0086     delete m_corona;
0087 }
0088 
0089 void CoronaTest::restore()
0090 {
0091     m_corona->loadLayout(QStringLiteral("plasma-test-appletsrc"));
0092     QCOMPARE(m_corona->containments().count(), 3);
0093 
0094     const auto containments = m_corona->containments();
0095     for (auto cont : containments) {
0096         switch (cont->id()) {
0097         case 1:
0098             QCOMPARE(cont->applets().count(), 2);
0099             break;
0100         default:
0101             QCOMPARE(cont->applets().count(), 0);
0102             break;
0103         }
0104     }
0105 }
0106 
0107 void CoronaTest::checkOrder()
0108 {
0109     QCOMPARE(m_corona->containments().count(), 3);
0110 
0111     // check containments order
0112     QCOMPARE(m_corona->containments().at(0)->id(), (uint)1);
0113     QCOMPARE(m_corona->containments().at(1)->id(), (uint)4);
0114     QCOMPARE(m_corona->containments().at(2)->id(), (uint)5);
0115 
0116     // check applets order
0117     QCOMPARE(m_corona->containments().at(0)->applets().count(), 2);
0118     QCOMPARE(m_corona->containments().at(0)->applets().at(0)->id(), (uint)2);
0119     QCOMPARE(m_corona->containments().at(0)->applets().at(1)->id(), (uint)3);
0120 }
0121 
0122 void CoronaTest::startupCompletion()
0123 {
0124     QVERIFY(!m_corona->isStartupCompleted());
0125     QVERIFY(!m_corona->containments().at(0)->isUiReady());
0126 
0127     QSignalSpy spy(m_corona, SIGNAL(startupCompleted()));
0128     QVERIFY(spy.wait(1000));
0129 
0130     QVERIFY(m_corona->isStartupCompleted());
0131     QVERIFY(m_corona->containments().at(0)->isUiReady());
0132 }
0133 
0134 void CoronaTest::addRemoveApplets()
0135 {
0136     m_corona->containments().at(0)->createApplet(QStringLiteral("invalid"));
0137     QCOMPARE(m_corona->containments().at(0)->applets().count(), 3);
0138 
0139     // remove action present
0140     QVERIFY(m_corona->containments().at(0)->applets().at(0)->actions()->action(QStringLiteral("remove")));
0141     // kill an applet
0142     m_corona->containments().at(0)->applets().at(0)->destroy();
0143 
0144     QSignalSpy spy(m_corona->containments().at(0)->applets().at(0), SIGNAL(destroyed()));
0145     QVERIFY(spy.wait(1000));
0146     QCOMPARE(m_corona->containments().at(0)->applets().count(), 2);
0147 }
0148 
0149 // this test has to be the last, since systemimmutability
0150 // can't be programmatically unlocked
0151 void CoronaTest::immutability()
0152 {
0153     // immutability
0154     QCOMPARE(m_corona->immutability(), Plasma::Types::Mutable);
0155     m_corona->setImmutability(Plasma::Types::UserImmutable);
0156     QCOMPARE(m_corona->immutability(), Plasma::Types::UserImmutable);
0157 
0158     auto containments = m_corona->containments();
0159     for (Plasma::Containment *cont : std::as_const(containments)) {
0160         QCOMPARE(cont->immutability(), Plasma::Types::UserImmutable);
0161         const auto lstApplets = cont->applets();
0162         for (Plasma::Applet *app : lstApplets) {
0163             QCOMPARE(app->immutability(), Plasma::Types::UserImmutable);
0164         }
0165     }
0166 
0167     m_corona->setImmutability(Plasma::Types::Mutable);
0168     QCOMPARE(m_corona->immutability(), Plasma::Types::Mutable);
0169 
0170     containments = m_corona->containments();
0171     for (Plasma::Containment *cont : std::as_const(containments)) {
0172         QCOMPARE(cont->immutability(), Plasma::Types::Mutable);
0173         const auto lstApplets = cont->applets();
0174         for (Plasma::Applet *app : lstApplets) {
0175             QCOMPARE(app->immutability(), Plasma::Types::Mutable);
0176         }
0177     }
0178 
0179     m_corona->setImmutability(Plasma::Types::SystemImmutable);
0180     QCOMPARE(m_corona->immutability(), Plasma::Types::SystemImmutable);
0181 
0182     containments = m_corona->containments();
0183     for (Plasma::Containment *cont : std::as_const(containments)) {
0184         QCOMPARE(cont->immutability(), Plasma::Types::SystemImmutable);
0185         const auto lstApplets = cont->applets();
0186         for (Plasma::Applet *app : lstApplets) {
0187             QCOMPARE(app->immutability(), Plasma::Types::SystemImmutable);
0188         }
0189     }
0190 
0191     // can't unlock systemimmutable
0192     m_corona->setImmutability(Plasma::Types::Mutable);
0193     QCOMPARE(m_corona->immutability(), Plasma::Types::SystemImmutable);
0194 
0195     containments = m_corona->containments();
0196     for (Plasma::Containment *cont : std::as_const(containments)) {
0197         QCOMPARE(cont->immutability(), Plasma::Types::SystemImmutable);
0198         const auto lstApplets = cont->applets();
0199         for (Plasma::Applet *app : lstApplets) {
0200             QCOMPARE(app->immutability(), Plasma::Types::SystemImmutable);
0201         }
0202     }
0203 }
0204 
0205 QTEST_MAIN(CoronaTest)
0206 
0207 #include "moc_coronatest.cpp"