1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2012 Bernhard Beschow <bbeschow@cs.tu-berlin.de>
4 //
5
6
7 #include "MarbleModel.h"
8 #include "PluginManager.h"
9 #include "RenderPlugin.h"
10
11 #include <QMetaType>
12 #include <QTest>
13
14 Q_DECLARE_METATYPE( const Marble::RenderPlugin * )
15
16 namespace Marble
17 {
18
19 class RenderPluginTest : public QObject
20 {
21 Q_OBJECT
22
23 private Q_SLOTS:
24 void newInstance_data();
25 void newInstance();
26
27 void initialize_data();
28 void initialize();
29
30 void setVisible_data();
31 void setVisible();
32
33 void setEnabled_data();
34 void setEnabled();
35
36 void setSettingsVisible_data();
37 void setSettingsVisible();
38
39 void setSettingsEnabled_data();
40 void setSettingsEnabled();
41
42 void setSettingsAllEqual_data();
43 void setSettingsAllEqual();
44
45 void restoreDefaultSettings_data();
46 void restoreDefaultSettings();
47
48 private:
49 MarbleModel m_model;
50 };
51
newInstance_data()52 void RenderPluginTest::newInstance_data()
53 {
54 QTest::addColumn<const RenderPlugin *>( "factory" );
55
56 foreach ( const RenderPlugin *factory, m_model.pluginManager()->renderPlugins() ) {
57 QTest::newRow(factory->nameId().toLatin1().constData())
58 << factory;
59 }
60 }
61
newInstance()62 void RenderPluginTest::newInstance()
63 {
64 QFETCH( const RenderPlugin *, factory );
65
66 RenderPlugin *const instance = factory->newInstance( &m_model );
67
68 const bool enabledByDefault = instance->enabled();
69 const bool visibleByDefault = instance->visible();
70
71 QVERIFY( instance->settings().contains( "enabled" ) );
72 QVERIFY( instance->settings().contains( "visible" ) );
73 QCOMPARE( instance->settings().value( "enabled", !enabledByDefault ).toBool(), enabledByDefault );
74 QCOMPARE( instance->settings().value( "visible", !visibleByDefault ).toBool(), visibleByDefault );
75
76 delete instance;
77 }
78
initialize_data()79 void RenderPluginTest::initialize_data()
80 {
81 QTest::addColumn<const RenderPlugin *>( "factory" );
82
83 foreach ( const RenderPlugin *plugin, m_model.pluginManager()->renderPlugins() ) {
84 QTest::newRow(plugin->nameId().toLatin1().constData())
85 << plugin;
86 }
87 }
88
initialize()89 void RenderPluginTest::initialize()
90 {
91 QFETCH( const RenderPlugin *, factory );
92
93 RenderPlugin *const instance = factory->newInstance( &m_model );
94
95 instance->initialize();
96
97 // prevent infinite loops
98 QVERIFY( instance->isInitialized() );
99 }
100
setVisible_data()101 void RenderPluginTest::setVisible_data()
102 {
103 QTest::addColumn<const RenderPlugin *>( "factory" );
104
105 foreach ( const RenderPlugin *factory, m_model.pluginManager()->renderPlugins() ) {
106 QTest::newRow(factory->nameId().toLatin1().constData())
107 << factory;
108 }
109 }
110
setVisible()111 void RenderPluginTest::setVisible()
112 {
113 QFETCH( const RenderPlugin *, factory );
114
115 RenderPlugin *const instance = factory->newInstance( &m_model );
116
117 const bool visibleByDefault = instance->visible();
118
119 instance->setVisible( !visibleByDefault );
120
121 QCOMPARE( instance->visible(), !visibleByDefault );
122 QCOMPARE( instance->settings().value( "visible", visibleByDefault ).toBool(), !visibleByDefault );
123
124 QHash<QString, QVariant> settings;
125 settings.insert( "visible", !visibleByDefault );
126
127 instance->setSettings( settings );
128 instance->setVisible( visibleByDefault ); // should also overwrite setting "visible"
129
130 QCOMPARE( instance->visible(), visibleByDefault );
131 QCOMPARE( instance->settings().value( "visible", !visibleByDefault ).toBool(), visibleByDefault );
132
133 delete instance;
134 }
135
setEnabled_data()136 void RenderPluginTest::setEnabled_data()
137 {
138 QTest::addColumn<const RenderPlugin *>( "factory" );
139
140 foreach ( const RenderPlugin *factory, m_model.pluginManager()->renderPlugins() ) {
141 QTest::newRow(factory->nameId().toLatin1().constData())
142 << factory;
143 }
144 }
145
setEnabled()146 void RenderPluginTest::setEnabled()
147 {
148 QFETCH( const RenderPlugin *, factory );
149
150 RenderPlugin *const instance = factory->newInstance( &m_model );
151
152 const bool enabledByDefault = instance->enabled();
153
154 instance->setEnabled( !enabledByDefault );
155
156 QCOMPARE( instance->enabled(), !enabledByDefault );
157 QCOMPARE( instance->settings().value( "enabled", enabledByDefault ).toBool(), !enabledByDefault );
158
159 QHash<QString, QVariant> settings;
160 settings.insert( "enabled", !enabledByDefault );
161
162 instance->setSettings( settings );
163 instance->setEnabled( enabledByDefault ); // should also overwrite setting "enabled"
164
165 QCOMPARE( instance->enabled(), enabledByDefault );
166 QCOMPARE( instance->settings().value( "enabled", !enabledByDefault ).toBool(), enabledByDefault );
167
168 delete instance;
169 }
170
setSettingsVisible_data()171 void RenderPluginTest::setSettingsVisible_data()
172 {
173 QTest::addColumn<const RenderPlugin *>( "factory" );
174
175 foreach ( const RenderPlugin *factory, m_model.pluginManager()->renderPlugins() ) {
176 QTest::newRow(factory->nameId().toLatin1().constData())
177 << factory;
178 }
179 }
180
setSettingsVisible()181 void RenderPluginTest::setSettingsVisible()
182 {
183 QFETCH( const RenderPlugin *, factory );
184
185 RenderPlugin *const instance = factory->newInstance( &m_model );
186
187 const bool visibleByDefault = instance->visible();
188
189 QHash<QString, QVariant> settings = instance->settings();
190
191 // visibile property should follow setting
192 settings.insert( "visible", !visibleByDefault );
193 instance->setSettings( settings );
194
195 QCOMPARE( instance->settings().value( "visible", visibleByDefault ).toBool(), !visibleByDefault );
196 QCOMPARE( instance->visible(), !visibleByDefault );
197
198 settings.insert( "visible", visibleByDefault );
199 instance->setSettings( settings );
200
201 QCOMPARE( instance->settings().value( "visible", !visibleByDefault ).toBool(), visibleByDefault );
202 QCOMPARE( instance->visible(), visibleByDefault );
203
204 // restoreDefaultSettings() is triggered by the config dialog, but it shouldn't touch visible property
205 instance->setVisible( !visibleByDefault );
206 instance->restoreDefaultSettings();
207
208 QCOMPARE( instance->visible(), !visibleByDefault );
209
210 delete instance;
211 }
212
setSettingsEnabled_data()213 void RenderPluginTest::setSettingsEnabled_data()
214 {
215 QTest::addColumn<const RenderPlugin *>( "factory" );
216
217 foreach ( const RenderPlugin *factory, m_model.pluginManager()->renderPlugins() ) {
218 QTest::newRow(factory->nameId().toLatin1().constData())
219 << factory;
220 }
221 }
222
setSettingsEnabled()223 void RenderPluginTest::setSettingsEnabled()
224 {
225 QFETCH( const RenderPlugin *, factory );
226
227 RenderPlugin *const instance = factory->newInstance( &m_model );
228
229 const bool enabledByDefault = instance->enabled();
230
231 QHash<QString, QVariant> settings = instance->settings();
232
233 // enabled property should follow setting
234 settings.insert( "enabled", !enabledByDefault );
235 instance->setSettings( settings );
236
237 QCOMPARE( instance->settings().value( "enabled", enabledByDefault ).toBool(), !enabledByDefault );
238 QCOMPARE( instance->enabled(), !enabledByDefault );
239
240 settings.insert( "enabled", enabledByDefault );
241 instance->setSettings( settings );
242
243 QCOMPARE( instance->settings().value( "enabled", !enabledByDefault ).toBool(), enabledByDefault );
244 QCOMPARE( instance->enabled(), enabledByDefault );
245
246 // restoreDefaultSettings() is triggered by the config dialog, but it shouldn't touch enabled property
247 instance->setEnabled( !enabledByDefault );
248 instance->restoreDefaultSettings();
249
250 QCOMPARE( instance->enabled(), !enabledByDefault );
251
252 delete instance;
253 }
254
setSettingsAllEqual_data()255 void RenderPluginTest::setSettingsAllEqual_data()
256 {
257 QTest::addColumn<QVariant>( "result" );
258 QTest::addColumn<QVariant>( "expected" );
259
260 foreach ( const RenderPlugin *plugin, m_model.pluginManager()->renderPlugins() ) {
261 const RenderPlugin *const expected = plugin->newInstance( &m_model );
262
263 RenderPlugin *const result = plugin->newInstance( &m_model );
264 result->setSettings( expected->settings() );
265
266 const QHash<QString, QVariant> settings = expected->settings();
267 QHash<QString, QVariant>::const_iterator itpoint = settings.begin();
268 QHash<QString, QVariant>::const_iterator const endpoint = settings.end();
269 for (; itpoint != endpoint; ++itpoint ) {
270 const QString testName = QString( "%1 %2" ).arg( plugin->nameId() ).arg( itpoint.key() );
271 QTest::newRow(testName.toLatin1().constData())
272 << result->settings().value(itpoint.key())
273 << expected->settings().value(itpoint.key());
274 }
275 }
276 }
277
setSettingsAllEqual()278 void RenderPluginTest::setSettingsAllEqual()
279 {
280 QFETCH( QVariant, result );
281 QFETCH( QVariant, expected );
282
283 QCOMPARE( result, expected );
284 }
285
restoreDefaultSettings_data()286 void RenderPluginTest::restoreDefaultSettings_data()
287 {
288 QTest::addColumn<QVariant>( "result" );
289 QTest::addColumn<QVariant>( "expected" );
290
291 foreach ( const RenderPlugin *plugin, m_model.pluginManager()->renderPlugins() ) {
292 RenderPlugin *const result = plugin->newInstance( &m_model );
293 result->initialize();
294
295 RenderPlugin *const expected = plugin->newInstance( &m_model );
296 expected->initialize();
297 expected->restoreDefaultSettings();
298
299 QHash<QString, QVariant> const & settings = expected->settings();
300 QHash<QString, QVariant>::const_iterator itpoint = settings.begin();
301 QHash<QString, QVariant>::const_iterator const endpoint = settings.end();
302 for (; itpoint != endpoint; ++itpoint ) {
303 const QString testName = QString( "%1 %2" ).arg( plugin->nameId() ).arg( itpoint.key() );
304 QTest::newRow(testName.toLatin1().constData())
305 << result->settings().value(itpoint.key())
306 << expected->settings().value(itpoint.key());
307 }
308 }
309 }
310
restoreDefaultSettings()311 void RenderPluginTest::restoreDefaultSettings()
312 {
313 QFETCH( QVariant, result );
314 QFETCH( QVariant, expected );
315
316 QCOMPARE( result, expected );
317 }
318
319 }
320
321 QTEST_MAIN( Marble::RenderPluginTest )
322
323 #include "RenderPluginTest.moc"
324