File indexing completed on 2024-04-28 09:26:03

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Sebastian Kügler <sebas@kde.org>
0003  *
0004  *  SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 
0007 #include <QObject>
0008 #include <QSignalSpy>
0009 #include <QTest>
0010 
0011 #include "../src/backendmanager_p.h"
0012 #include "../src/config.h"
0013 #include "../src/configmonitor.h"
0014 #include "../src/getconfigoperation.h"
0015 #include "../src/mode.h"
0016 #include "../src/output.h"
0017 
0018 using namespace KScreen;
0019 
0020 class TestModeListChange : public QObject
0021 {
0022     Q_OBJECT
0023 
0024 private:
0025     KScreen::ConfigPtr getConfig();
0026     KScreen::ModeList createModeList();
0027     bool compareModeList(KScreen::ModeList before, KScreen::ModeList &after);
0028 
0029     QSize s0 = QSize(1920, 1080);
0030     QSize s1 = QSize(1600, 1200);
0031     QSize s2 = QSize(1280, 1024);
0032     QSize s3 = QSize(800, 600);
0033     QSize snew = QSize(777, 888);
0034     QString idnew = QStringLiteral("666");
0035 
0036 private Q_SLOTS:
0037     void initTestCase();
0038     void cleanupTestCase();
0039 
0040     void modeListChange();
0041 };
0042 
0043 ConfigPtr TestModeListChange::getConfig()
0044 {
0045     qputenv("KSCREEN_BACKEND_INPROCESS", "1");
0046     auto *op = new GetConfigOperation();
0047     if (!op->exec()) {
0048         qWarning("ConfigOperation error: %s", qPrintable(op->errorString()));
0049         BackendManager::instance()->shutdownBackend();
0050         return ConfigPtr();
0051     }
0052 
0053     BackendManager::instance()->shutdownBackend();
0054 
0055     return op->config();
0056 }
0057 
0058 KScreen::ModeList TestModeListChange::createModeList()
0059 {
0060     KScreen::ModeList newmodes;
0061     {
0062         QString _id = QString::number(11);
0063         KScreen::ModePtr kscreenMode(new KScreen::Mode);
0064         kscreenMode->setId(_id);
0065         kscreenMode->setName(_id);
0066         kscreenMode->setSize(s0);
0067         kscreenMode->setRefreshRate(60);
0068         newmodes.insert(_id, kscreenMode);
0069     }
0070     {
0071         QString _id = QString::number(22);
0072         KScreen::ModePtr kscreenMode(new KScreen::Mode);
0073         kscreenMode->setId(_id);
0074         kscreenMode->setName(_id);
0075         kscreenMode->setSize(s1);
0076         kscreenMode->setRefreshRate(60);
0077         newmodes.insert(_id, kscreenMode);
0078     }
0079     {
0080         QString _id = QString::number(33);
0081         KScreen::ModePtr kscreenMode(new KScreen::Mode);
0082         kscreenMode->setId(_id);
0083         kscreenMode->setName(_id);
0084         kscreenMode->setSize(s2);
0085         kscreenMode->setRefreshRate(60);
0086         newmodes.insert(_id, kscreenMode);
0087     }
0088     return newmodes;
0089 }
0090 
0091 void TestModeListChange::initTestCase()
0092 {
0093     qputenv("KSCREEN_LOGGING", "false");
0094     qputenv("KSCREEN_BACKEND", "Fake");
0095 }
0096 
0097 void TestModeListChange::cleanupTestCase()
0098 {
0099     BackendManager::instance()->shutdownBackend();
0100 }
0101 
0102 void TestModeListChange::modeListChange()
0103 {
0104     // json file for the fake backend
0105     KScreen::BackendManager::instance()->setBackendArgs({{QStringLiteral("TEST_DATA"), TEST_DATA "singleoutput.json"}});
0106 
0107     const ConfigPtr config = getConfig();
0108     QVERIFY(!config.isNull());
0109 
0110     auto output = config->outputs().first();
0111     QVERIFY(!output.isNull());
0112     auto modelist = output->modes();
0113 
0114     auto mode = modelist.first();
0115     mode->setId(QStringLiteral("44"));
0116     mode->setSize(QSize(880, 440));
0117     output->setModes(modelist);
0118 
0119     QCOMPARE(output->modes().first()->id(), QStringLiteral("44"));
0120     QCOMPARE(output->modes().first()->size(), QSize(880, 440));
0121     QVERIFY(!modelist.isEmpty());
0122 
0123     ConfigMonitor::instance()->addConfig(config);
0124     QSignalSpy outputChangedSpy(output.data(), &Output::outputChanged);
0125     QVERIFY(outputChangedSpy.isValid());
0126     QSignalSpy modesChangedSpy(output.data(), &Output::modesChanged);
0127     QVERIFY(modesChangedSpy.isValid());
0128 
0129     auto before = createModeList();
0130     output->setModes(before);
0131     QCOMPARE(modesChangedSpy.count(), 1);
0132     output->setModes(before);
0133     QCOMPARE(modesChangedSpy.count(), 1);
0134     output->setModes(before);
0135     QCOMPARE(modesChangedSpy.count(), 1);
0136     QCOMPARE(output->modes().first()->size(), s0);
0137     QCOMPARE(output->modes().first()->id(), QStringLiteral("11"));
0138 
0139     auto after = createModeList();
0140     auto firstmode = after.first();
0141     QVERIFY(!firstmode.isNull());
0142     QCOMPARE(firstmode->size(), s0);
0143     QCOMPARE(firstmode->id(), QStringLiteral("11"));
0144     firstmode->setSize(snew);
0145     firstmode->setId(idnew);
0146     output->setModes(after);
0147     QCOMPARE(modesChangedSpy.count(), 2);
0148 
0149     QString _id = QString::number(11);
0150     KScreen::ModePtr kscreenMode(new KScreen::Mode);
0151     kscreenMode->setId(_id);
0152     kscreenMode->setName(_id);
0153     kscreenMode->setSize(s0);
0154     kscreenMode->setRefreshRate(60);
0155     before.insert(_id, kscreenMode);
0156     output->setModes(before);
0157     QCOMPARE(modesChangedSpy.count(), 3);
0158     QCOMPARE(outputChangedSpy.count(), modesChangedSpy.count());
0159 }
0160 
0161 QTEST_MAIN(TestModeListChange)
0162 
0163 #include "testmodelistchange.moc"