File indexing completed on 2024-04-14 15:37:31

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