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