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