File indexing completed on 2024-05-19 05:34:38

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