1 // SPDX-License-Identifier: LGPL-2.1-or-later
2 //
3 // SPDX-FileCopyrightText: 2011 Utku Aydın <utkuaydin34@gmail.com>
4 //
5
6 #include <QObject>
7 #include <QTemporaryFile>
8 #include <QTest>
9 #include <QDebug>
10 #include <QDir>
11
12 #include "GeoSceneDocument.h"
13 #include "GeoSceneHead.h"
14 #include "GeoSceneZoom.h"
15 #include "GeoSceneIcon.h"
16 #include "GeoSceneMap.h"
17 #include "GeoSceneLayer.h"
18 #include "GeoSceneTileDataset.h"
19 #include "GeoSceneGeodata.h"
20 #include "GeoSceneSettings.h"
21 #include "GeoSceneProperty.h"
22 #include "GeoSceneLegend.h"
23 #include "GeoSceneSection.h"
24 #include "GeoSceneItem.h"
25 #include "GeoSceneVector.h"
26 #include "DgmlElementDictionary.h"
27
28 #include "GeoWriter.h"
29 #include "GeoSceneParser.h"
30
31 using namespace Marble;
32
33 class TestGeoSceneWriter : public QObject
34 {
35 Q_OBJECT
36
37 private Q_SLOTS:
38 void initTestCase();
39 void saveFile_data();
40 void saveFile();
41 void saveAndLoad_data();
42 void saveAndLoad();
43 void saveAndCompare_data();
44 void saveAndCompare();
45
46 void writeHeadTag();
47 private:
48 QDir dgmlPath;
49 QMap<QString, QSharedPointer<GeoSceneParser> > parsers;
50 };
51
Q_DECLARE_METATYPE(QSharedPointer<GeoSceneParser>)52 Q_DECLARE_METATYPE( QSharedPointer<GeoSceneParser> )
53
54 void TestGeoSceneWriter::initTestCase()
55 {
56 QStringList dgmlFilters;
57 dgmlFilters << "*.dgml";
58
59 dgmlPath = QDir( DGML_PATH );
60 dgmlPath.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
61
62 foreach( const QString &dgmlDirname, dgmlPath.entryList() ) {
63 qDebug() << dgmlDirname;
64 QDir dataDir(dgmlPath.absoluteFilePath(dgmlDirname));
65 dataDir.setNameFilters( dgmlFilters );
66
67 //check there are dgml files in the data dir
68 if( dataDir.count() == 0 ) {
69 continue;
70 }
71
72 //test the loading of each file in the data dir
73 foreach( const QString &filename, dataDir.entryList(dgmlFilters, QDir::Files) ){
74
75 //Add example files
76 QFile file( dataDir.filePath(filename));
77
78 //Verify file existence
79 QVERIFY( file.exists() );
80
81 //Make the parsers
82 GeoSceneParser* parser = new GeoSceneParser( GeoScene_DGML );
83
84 QSharedPointer<GeoSceneParser>parserPointer ( parser );
85
86 //Open the files and verify
87 QVERIFY( file.open( QIODevice::ReadOnly ) );
88
89 //Parser and verify
90 QVERIFY2(parser->read(&file), filename.toLatin1().constData());
91
92 parsers.insert( dataDir.filePath(filename), parserPointer );
93
94 //close files
95 file.close();
96 }
97 }
98 }
99
saveFile_data()100 void TestGeoSceneWriter::saveFile_data()
101 {
102 QTest::addColumn<QSharedPointer<GeoSceneParser> >( "parser" );
103
104 QMap<QString, QSharedPointer<GeoSceneParser> >::iterator itpoint = parsers.begin();
105 QMap<QString, QSharedPointer<GeoSceneParser> >::iterator const endpoint = parsers.end();
106 for (; itpoint != endpoint; ++itpoint ) {
107 QTest::newRow(itpoint.key().toLatin1().constData()) << itpoint.value();
108 }
109 }
110
saveFile()111 void TestGeoSceneWriter::saveFile()
112 {
113 QFETCH( QSharedPointer<GeoSceneParser>, parser );
114
115 //attempt to save a file using the GeoWriter
116 QTemporaryFile tempFile;
117
118 GeoWriter writer;
119 writer.setDocumentType( dgml::dgmlTag_nameSpace20 );
120
121 // Open file in right mode
122 QVERIFY( tempFile.open() );
123
124 QVERIFY( writer.write( &tempFile, (dynamic_cast<GeoSceneDocument*>(parser->activeDocument() ) ) ) );
125 }
126
saveAndLoad_data()127 void TestGeoSceneWriter::saveAndLoad_data()
128 {
129 QTest::addColumn<QSharedPointer<GeoSceneParser> >( "parser" );
130
131 QMap<QString, QSharedPointer<GeoSceneParser> >::iterator itpoint = parsers.begin();
132 QMap<QString, QSharedPointer<GeoSceneParser> >::iterator const endpoint = parsers.end();
133 for (; itpoint != endpoint; ++itpoint ) {
134 QTest::newRow(itpoint.key().toLatin1().constData()) << itpoint.value();
135 }
136 }
137
saveAndLoad()138 void TestGeoSceneWriter::saveAndLoad()
139 {
140 //Save the file and then verify loading it again
141 QFETCH( QSharedPointer<GeoSceneParser>, parser );
142
143 QTemporaryFile tempFile;
144 GeoWriter writer;
145 writer.setDocumentType( dgml::dgmlTag_nameSpace20 );
146
147 // Open file in right mode
148 QVERIFY( tempFile.open() );
149
150 QVERIFY( writer.write( &tempFile, (dynamic_cast<GeoSceneDocument*>(parser->activeDocument() ) ) ) );
151
152 GeoSceneParser resultParser( GeoScene_DGML );
153
154 tempFile.reset();
155 QVERIFY( resultParser.read( &tempFile ) );
156 }
157
saveAndCompare_data()158 void TestGeoSceneWriter::saveAndCompare_data()
159 {
160 QTest::addColumn<QSharedPointer<GeoSceneParser> >("parser");
161 QTest::addColumn<QString>("original");
162
163 QMap<QString, QSharedPointer<GeoSceneParser> >::iterator itpoint = parsers.begin();
164 QMap<QString, QSharedPointer<GeoSceneParser> >::iterator const endpoint = parsers.end();
165 for (; itpoint != endpoint; ++itpoint ) {
166 QTest::newRow(itpoint.key().toLatin1().constData()) << itpoint.value() << itpoint.key();
167 }
168 }
169
saveAndCompare()170 void TestGeoSceneWriter::saveAndCompare()
171 {
172 //save the file and compare it to the original
173 QFETCH( QSharedPointer<GeoSceneParser>, parser );
174 QFETCH( QString, original );
175
176 //attempt to save a file using the GeoWriter
177 QTemporaryFile tempFile;
178
179 GeoWriter writer;
180 //FIXME: a better way to do this?
181 writer.setDocumentType( dgml::dgmlTag_nameSpace20 );
182
183 // Open file in right mode
184 QVERIFY( tempFile.open() );
185
186 QVERIFY( writer.write( &tempFile, (dynamic_cast<GeoSceneDocument*>(parser->activeDocument() ) ) ) );
187
188 QFile file( original );
189 QVERIFY( file.open( QIODevice::ReadOnly ) );
190 QVERIFY( tempFile.reset() );
191 QTextStream oldFile( &file );
192 QTextStream newFile( &tempFile );
193
194 QVERIFY( newFile.readAll().simplified().compare( oldFile.readAll().simplified() ) );
195 }
196
writeHeadTag()197 void TestGeoSceneWriter::writeHeadTag()
198 {
199 GeoSceneDocument *document = new GeoSceneDocument;
200
201 GeoSceneHead* head = document->head();
202 head->setName( "Test Map" );
203 head->setTheme( "testmap" );
204 head->setTarget( "earth" );
205
206 GeoSceneIcon* icon = document->head()->icon();
207 icon->setPixmap( "preview.jpg" );
208
209 GeoSceneZoom* zoom = document->head()->zoom();
210 zoom->setMaximum( 1000 );
211 zoom->setMaximum( 500 );
212 zoom->setDiscrete( true );
213
214 GeoSceneTileDataset* texture = new GeoSceneTileDataset( "map" );
215 texture->setSourceDir( "earth/testmap" );
216 texture->setFileFormat( "png" );
217 texture->setTileProjection(GeoSceneAbstractTileProjection::Equirectangular);
218 texture->addDownloadUrl( QUrl( "http://download.kde.org/marble/map/{x}/{y}/{zoomLevel}" ) );
219 texture->addDownloadUrl( QUrl( "http://download.google.com/marble/map/{x}/{y}/{zoomLevel}" ) );
220 texture->addDownloadPolicy( DownloadBrowse, 20 );
221 texture->addDownloadPolicy( DownloadBulk, 20 );
222 texture->setMaximumTileLevel( 15 );
223 texture->setLevelZeroColumns( 2 );
224 texture->setLevelZeroRows( 2 );
225
226 GeoSceneGeodata* geodata = new GeoSceneGeodata( "cityplacemarks" );
227 geodata->setSourceFile( "baseplacemarks.kml" );
228
229 GeoSceneLayer* layer = new GeoSceneLayer( "testmap" );
230 layer->setBackend( "texture" );
231 layer->addDataset( texture );
232
233 GeoSceneLayer* secondLayer = new GeoSceneLayer( "standardplaces" );
234 secondLayer->setBackend( "geodata" );
235 secondLayer->addDataset( geodata );
236
237 GeoSceneLayer* thirdLayer = new GeoSceneLayer( "mwdbii" );
238 thirdLayer->setBackend( "vector" );
239 thirdLayer->setRole( "polyline" );
240
241 GeoSceneVector* vector = new GeoSceneVector( "pdiffborder" );
242 vector->setFeature( "border" );
243 vector->setFileFormat( "PNT" );
244 vector->setSourceFile( "earth/mwdbii/PDIFFBORDER.PNT" );
245 vector->pen().setColor( "#ffe300" );
246 thirdLayer->addDataset( vector );
247
248 GeoSceneMap* map = document->map();
249 map->addLayer( layer );
250 map->addLayer( secondLayer );
251 map->addLayer( thirdLayer );
252
253 GeoSceneSettings *settings = document->settings();
254
255 GeoSceneProperty *coorGrid = new GeoSceneProperty( "coordinate-grid" );
256 coorGrid->setValue( true );
257 coorGrid->setAvailable( true );
258 settings->addProperty( coorGrid );
259
260 GeoSceneProperty *overviewmap = new GeoSceneProperty( "overviewmap" );
261 overviewmap->setValue( true );
262 overviewmap->setAvailable( true );
263 settings->addProperty( overviewmap );
264
265 GeoSceneProperty *compass = new GeoSceneProperty( "compass" );
266 compass->setValue( true );
267 compass->setAvailable( true );
268 settings->addProperty( compass );
269
270 GeoSceneProperty *scalebar = new GeoSceneProperty( "scalebar" );
271 scalebar->setValue( true );
272 scalebar->setAvailable( true );
273 settings->addProperty( scalebar );
274
275 GeoSceneLegend* legend = document->legend();
276 GeoSceneSection* section = new GeoSceneSection( "areas" );
277 section->setHeading( "Areas" );
278 legend->addSection( section );
279
280 GeoSceneItem* sportsPitch = new GeoSceneItem( "sports_pitch" );
281 sportsPitch->setText( "Sports pitch" );
282 GeoSceneIcon* sportsPitchIcon = sportsPitch->icon();
283 sportsPitchIcon->setPixmap( "maps/earth/testmap/legend/sports_pitch.png" );
284 section->addItem( sportsPitch );
285
286 GeoSceneItem* sportsCentre = new GeoSceneItem( "sports_centre" );
287 sportsCentre->setText( "Sports centre" );
288 GeoSceneIcon* sportsCentreIcon = sportsCentre->icon();
289 sportsCentreIcon->setColor( "#00FF00" );
290 section->addItem( sportsCentre );
291
292 QTemporaryFile tempFile;
293 tempFile.open();
294
295 GeoWriter writer;
296 writer.setDocumentType( "http://edu.kde.org/marble/dgml/2.0" );
297 QVERIFY( writer.write( &tempFile, document ) );
298
299 //Parser and verify
300 GeoSceneParser parser( GeoScene_DGML );
301 tempFile.reset();
302 QVERIFY( parser.read( &tempFile ) );
303
304 GeoSceneDocument *document2 = static_cast<GeoSceneDocument*>( parser.activeDocument() );
305 QTemporaryFile tempFile2;
306 tempFile2.open();
307 GeoWriter writer2;
308 writer2.setDocumentType( "http://edu.kde.org/marble/dgml/2.0" );
309 QVERIFY( writer2.write( &tempFile2, document2 ) );
310
311 tempFile.reset();
312 QTextStream file( &tempFile );
313 tempFile2.reset();
314 QTextStream file2( &tempFile2 );
315 QVERIFY( file.readAll().simplified().compare( file2.readAll().simplified() ) );
316
317 delete document;
318 }
319
320 QTEST_MAIN( TestGeoSceneWriter )
321 #include "TestGeoSceneWriter.moc"
322