1 /*************************************************************************************
2 * Copyright 2016 by Sebastian Kügler <sebas@kde.org> *
3 * *
4 * This library is free software; you can redistribute it and/or *
5 * modify it under the terms of the GNU Lesser General Public *
6 * License as published by the Free Software Foundation; either *
7 * version 2.1 of the License, or (at your option) any later version. *
8 * *
9 * This library is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
12 * Lesser General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU Lesser General Public *
15 * License along with this library; if not, write to the Free Software *
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *
17 *************************************************************************************/
18 #include <QObject>
19 #include <QtTest>
20
21 #include "backendmanager_p.h"
22 #include "config.h"
23 #include "configmonitor.h"
24 #include "getconfigoperation.h"
25 #include "mode.h"
26 #include "output.h"
27 #include "setconfigoperation.h"
28
29 using namespace Disman;
30
31 class TestModeMapChange : public QObject
32 {
33 Q_OBJECT
34
35 private:
36 Disman::ConfigPtr getConfig();
37 Disman::ModeMap createModeMap();
38 bool compareModeMap(Disman::ModeMap before, Disman::ModeMap& after);
39
40 QSize s0 = QSize(1920, 1080);
41 QSize s1 = QSize(1600, 1200);
42 QSize s2 = QSize(1280, 1024);
43 QSize s3 = QSize(800, 600);
44 QSize snew = QSize(777, 888);
45 std::string idnew = "666";
46
47 private Q_SLOTS:
48 void initTestCase();
49 void cleanupTestCase();
50
51 void modeListChange();
52 };
53
getConfig()54 ConfigPtr TestModeMapChange::getConfig()
55 {
56 qputenv("DISMAN_IN_PROCESS", "1");
57 auto* op = new GetConfigOperation();
58 if (!op->exec()) {
59 qWarning("ConfigOperation error: %s", qPrintable(op->error_string()));
60 BackendManager::instance()->shutdown_backend();
61 return ConfigPtr();
62 }
63
64 BackendManager::instance()->shutdown_backend();
65
66 return op->config();
67 }
68
createModeMap()69 Disman::ModeMap TestModeMapChange::createModeMap()
70 {
71
72 Disman::ModeMap newmodes;
73 {
74 auto _id = std::to_string(11);
75 Disman::ModePtr dismanMode(new Disman::Mode);
76 dismanMode->set_id(_id);
77 dismanMode->set_name(_id);
78 dismanMode->set_size(s0);
79 dismanMode->set_refresh(60);
80 newmodes.insert({_id, dismanMode});
81 }
82 {
83 auto _id = std::to_string(22);
84 Disman::ModePtr dismanMode(new Disman::Mode);
85 dismanMode->set_id(_id);
86 dismanMode->set_name(_id);
87 dismanMode->set_size(s1);
88 dismanMode->set_refresh(60);
89 newmodes.insert({_id, dismanMode});
90 }
91 {
92 auto _id = std::to_string(33);
93 Disman::ModePtr dismanMode(new Disman::Mode);
94 dismanMode->set_id(_id);
95 dismanMode->set_name(_id);
96 dismanMode->set_size(s2);
97 dismanMode->set_refresh(60);
98 newmodes.insert({_id, dismanMode});
99 }
100 return newmodes;
101 }
102
initTestCase()103 void TestModeMapChange::initTestCase()
104 {
105 qputenv("DISMAN_LOGGING", "false");
106 qputenv("DISMAN_BACKEND", "Fake");
107 }
108
cleanupTestCase()109 void TestModeMapChange::cleanupTestCase()
110 {
111 BackendManager::instance()->shutdown_backend();
112 }
113
modeListChange()114 void TestModeMapChange::modeListChange()
115 {
116 // json file for the fake backend
117 qputenv("DISMAN_BACKEND_ARGS", "TEST_DATA=" TEST_DATA "singleoutput.json");
118
119 const ConfigPtr config = getConfig();
120 QVERIFY(config);
121
122 auto output = config->outputs().begin()->second;
123 QVERIFY(output);
124 auto modelist = output->modes();
125
126 auto mode = modelist.begin()->second;
127 mode->set_id("44");
128 mode->set_size(QSize(880, 440));
129 output->set_modes(modelist);
130
131 QCOMPARE(output->modes().begin()->second->id(), "44");
132 QCOMPARE(output->modes().begin()->second->size(), QSize(880, 440));
133 QVERIFY(!modelist.empty());
134
135 ConfigMonitor::instance()->add_config(config);
136
137 auto before = createModeMap();
138 output->set_modes(before);
139 output->set_modes(before);
140 output->set_modes(before);
141 QCOMPARE(output->modes().begin()->second->size(), s0);
142 QCOMPARE(output->modes().begin()->second->id(), "11");
143
144 auto after = createModeMap();
145 auto firstmode = after.begin()->second;
146 QVERIFY(firstmode);
147 QCOMPARE(firstmode->size(), s0);
148 QCOMPARE(firstmode->id(), "11");
149 firstmode->set_size(snew);
150 firstmode->set_id(idnew);
151 output->set_modes(after);
152
153 auto _id = std::to_string(11);
154 Disman::ModePtr dismanMode(new Disman::Mode);
155 dismanMode->set_id(_id);
156 dismanMode->set_name(_id);
157 dismanMode->set_size(s0);
158 dismanMode->set_refresh(60);
159 before.insert({_id, dismanMode});
160 output->set_modes(before);
161 QCOMPARE(output->modes().size(), 3);
162
163 auto _id2 = std::to_string(999);
164 Disman::ModePtr dismanMode2(new Disman::Mode);
165 dismanMode2->set_id(_id2);
166 dismanMode2->set_name(_id2);
167 dismanMode2->set_size(s0);
168 dismanMode2->set_refresh(60);
169 before.insert({_id2, dismanMode2});
170 output->set_modes(before);
171 QCOMPARE(output->modes().size(), 4);
172 QCOMPARE(output->modes()[_id2]->id(), _id2);
173 }
174
175 QTEST_MAIN(TestModeMapChange)
176
177 #include "testmodelistchange.moc"
178