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