File indexing completed on 2024-04-21 03:50:42

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2009 Andrew Manson <g.real.ate@gmail.com>
0004 //
0005 
0006 #include <QObject>
0007 
0008 #include "GeoDataParser.h"
0009 #include "GeoDataDocument.h"
0010 #include "GeoDataColorStyle.h"
0011 #include "GeoWriter.h"
0012 #include <geodata/handlers/kml/KmlElementDictionary.h>
0013 
0014 #include <QDir>
0015 #include <QFile>
0016 #include <QTest>
0017 #include <QTextStream>
0018 #include <QBuffer>
0019 
0020 using namespace Marble;
0021 
0022 class TestGeoDataWriter : public QObject
0023 {
0024     Q_OBJECT
0025 private Q_SLOTS:
0026     void initTestCase();
0027     void countFeatures_data();
0028     void saveFile_data();
0029     void saveFile();
0030     void saveAndLoad_data();
0031     void saveAndLoad();
0032     void saveAndCompare_data();
0033     void saveAndCompare();
0034     void saveAndCompareEquality_data();
0035     void saveAndCompareEquality();
0036     void cleanupTestCase();
0037 private:
0038     QDir dataDir;
0039     QMap<QString, QSharedPointer<GeoDataParser> > parsers;
0040     QStringList m_testFiles;
0041 };
0042 
0043 Q_DECLARE_METATYPE( QSharedPointer<GeoDataParser> )
0044 
0045 void TestGeoDataWriter::initTestCase()
0046 {
0047     dataDir = QDir( TESTSRCDIR );
0048     dataDir.cd( "data" );
0049     //check there are files in the data dir
0050     QVERIFY( dataDir.count() > 0 );
0051 
0052     //test the loading of each file in the data dir
0053     foreach( const QString &filename, dataDir.entryList(QStringList() << "*.kml", QDir::Files) ){
0054         QFile file( dataDir.filePath(filename));
0055         QVERIFY( file.exists() );
0056 
0057         // Create parsers
0058         GeoDataParser* parser = new GeoDataParser( GeoData_KML );
0059         QSharedPointer<GeoDataParser>parserPointer ( parser );
0060 
0061         // Open the files and verify
0062         QVERIFY( file.open( QIODevice::ReadOnly ) );
0063         QVERIFY2(parser->read(&file), filename.toLatin1().constData());
0064 
0065         parsers.insert( filename, parserPointer );
0066         m_testFiles << filename;
0067         file.close();
0068     }
0069 }
0070 
0071 void TestGeoDataWriter::countFeatures_data()
0072 {
0073     QTest::addColumn<QSharedPointer<GeoDataParser> >("parser");
0074     foreach( const QString &file, m_testFiles ) {
0075         QTest::newRow(file.toStdString().c_str()) << parsers.value(file);
0076     }
0077 }
0078 
0079 void TestGeoDataWriter::saveFile_data()
0080 {
0081     QTest::addColumn<QSharedPointer<GeoDataParser> >( "parser" );
0082     foreach( const QString &file, m_testFiles ) {
0083         QTest::newRow(file.toStdString().c_str()) << parsers.value(file);
0084     }
0085 }
0086 
0087 void TestGeoDataWriter::saveFile()
0088 {
0089     QFETCH( QSharedPointer<GeoDataParser>, parser );
0090 
0091     //attempt to save a file using the GeoWriter
0092     QByteArray data;
0093     QBuffer buffer( &data );
0094 
0095     GeoWriter writer;
0096     //FIXME: a better way to do this?
0097     writer.setDocumentType( kml::kmlTag_nameSpaceOgc22 );
0098 
0099     // Open file in right mode
0100     QVERIFY( buffer.open( QIODevice::WriteOnly ) );
0101 
0102     QVERIFY( writer.write( &buffer, &(*dynamic_cast<GeoDataFeature*>(parser->activeDocument() ) ) ) );
0103 
0104 }
0105 
0106 void TestGeoDataWriter::saveAndLoad_data()
0107 {
0108     QTest::addColumn<QSharedPointer<GeoDataParser> >("parser");
0109     foreach( const QString &file, m_testFiles ) {
0110         QTest::newRow(file.toStdString().c_str()) << parsers.value(file);
0111     }
0112 }
0113 
0114 void TestGeoDataWriter::saveAndLoad()
0115 {
0116     //Save the file and then verify loading it again
0117     QFETCH( QSharedPointer<GeoDataParser>, parser );
0118 
0119     QByteArray data;
0120     QBuffer buffer( &data );
0121 
0122     GeoWriter writer;
0123     //FIXME: a better way to do this?
0124     writer.setDocumentType( kml::kmlTag_nameSpaceOgc22 );
0125 
0126     // Open file in right mode
0127     QVERIFY( buffer.open( QIODevice::ReadWrite ) );
0128 
0129     QVERIFY( writer.write( &buffer, &( *dynamic_cast<GeoDataFeature*>(parser->activeDocument() ) ) ) );
0130 
0131     GeoDataParser resultParser( GeoData_KML );
0132 
0133     buffer.reset();
0134     QVERIFY( resultParser.read( &buffer ) );
0135 }
0136 
0137 void TestGeoDataWriter::saveAndCompare_data()
0138 {
0139     QTest::addColumn<QSharedPointer<GeoDataParser> >("parser");
0140     QTest::addColumn<QString>("original");
0141 
0142     foreach( const QString &file, m_testFiles ) {
0143         QTest::newRow(file.toStdString().c_str()) << parsers.value(file) << file;
0144     }
0145 }
0146 
0147 void TestGeoDataWriter::saveAndCompare()
0148 {
0149     //save the file and compare it to the original
0150     QFETCH( QSharedPointer<GeoDataParser>, parser );
0151     QFETCH( QString, original );
0152 
0153     //attempt to save a file using the GeoWriter
0154     QByteArray data;
0155     QBuffer buffer( &data );
0156     buffer.open( QIODevice::ReadWrite );
0157 
0158     GeoWriter writer;
0159     //FIXME: a better way to do this?
0160     writer.setDocumentType( kml::kmlTag_nameSpaceOgc22 );
0161 
0162     QVERIFY( writer.write( &buffer, &( *dynamic_cast<GeoDataFeature*>(parser->activeDocument() ) ) ) );
0163 
0164     QFile file( dataDir.filePath( original ) );
0165     QVERIFY( file.open( QIODevice::ReadOnly ) );
0166     QVERIFY( buffer.reset() );
0167     QTextStream oldFile( &file );
0168     QTextStream newFile( &buffer );
0169 
0170     QEXPECT_FAIL("AltitudeMode.kml", "TimeSpan element is not preserved", Continue);
0171     QCOMPARE( newFile.readAll().simplified(), oldFile.readAll().simplified() );
0172 }
0173 
0174 void TestGeoDataWriter::saveAndCompareEquality_data()
0175 {
0176     QTest::addColumn<QSharedPointer<GeoDataParser> >("parser");
0177     QTest::addColumn<QString>("original");
0178 
0179     foreach( const QString &file, m_testFiles ) {
0180         QTest::newRow(file.toStdString().c_str()) << parsers.value(file) << file;
0181     }
0182 }
0183 
0184 void TestGeoDataWriter::saveAndCompareEquality()
0185 {
0186     QFETCH( QSharedPointer<GeoDataParser>, parser );
0187     QFETCH( QString, original );
0188 
0189     QByteArray data;
0190     QBuffer buffer( &data );
0191     buffer.open( QIODevice::ReadWrite );
0192 
0193     GeoWriter writer;
0194     //FIXME: a better way to do this?
0195     writer.setDocumentType( kml::kmlTag_nameSpaceOgc22 );
0196 
0197     GeoDataDocument *initialDoc = dynamic_cast<GeoDataDocument*>( parser->activeDocument() );
0198     QVERIFY( writer.write( &buffer, initialDoc) );
0199 
0200     buffer.reset();
0201     GeoDataParser otherParser( GeoData_KML);
0202     QVERIFY( otherParser.read( &buffer ) );
0203 
0204     GeoDataDocument *otherDoc = dynamic_cast<GeoDataDocument*>( otherParser.activeDocument() );
0205     QVERIFY( *initialDoc == *otherDoc );
0206 }
0207 
0208 void TestGeoDataWriter::cleanupTestCase()
0209 {
0210     QMap<QString, QSharedPointer<GeoDataParser> >::iterator itpoint = parsers.begin();
0211     QMap<QString, QSharedPointer<GeoDataParser> >::iterator const endpoint = parsers.end();
0212     for (; itpoint != endpoint; ++itpoint ) {
0213         delete itpoint.value()->releaseDocument();
0214     }
0215 }
0216 
0217 QTEST_MAIN( TestGeoDataWriter )
0218 #include "TestGeoDataWriter.moc"
0219