diff --git a/ci/travis/linux/script.sh b/ci/travis/linux/script.sh index 0ab8c4c1b41..d7e680ea9c7 100755 --- a/ci/travis/linux/script.sh +++ b/ci/travis/linux/script.sh @@ -21,5 +21,5 @@ export CCACHE_TEMPDIR=/tmp DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -xvfb-run ctest -V -E "qgis_openstreetmaptest|qgis_wcsprovidertest|PyQgsWFSProviderGUI|qgis_ziplayertest|qgis_ogcutilstest|$(cat ${DIR}/blacklist.txt | paste -sd '|' -)" -S ./qgis-test-travis.ctest --output-on-failure +xvfb-run ctest -V -E "qgis_openstreetmaptest|qgis_wcsprovidertest|PyQgsWFSProviderGUI|qgis_ziplayertest|$(cat ${DIR}/blacklist.txt | paste -sd '|' -)" -S ./qgis-test-travis.ctest --output-on-failure # xvfb-run ctest -V -E "qgis_openstreetmaptest|qgis_wcsprovidertest" -S ./qgis-test-travis.ctest --output-on-failure diff --git a/tests/src/core/testqgsogcutils.cpp b/tests/src/core/testqgsogcutils.cpp index dd0d510963f..9fd87c395ca 100644 --- a/tests/src/core/testqgsogcutils.cpp +++ b/tests/src/core/testqgsogcutils.cpp @@ -93,12 +93,126 @@ void TestQgsOgcUtils::testGeometryFromGML() QVERIFY( geomBox.wkbType() == QgsWkbTypes::Polygon ); } +static bool compareElements( QDomElement& element1, QDomElement& element2 ) +{ + QString tag1 = element1.tagName(); + tag1.replace( QRegExp( ".*:" ), "" ); + QString tag2 = element2.tagName(); + tag2.replace( QRegExp( ".*:" ), "" ); + if ( tag1 != tag2 ) + { + qDebug( "Different tag names: %s, %s", tag1.toAscii().data(), tag2.toAscii().data() ); + return false ; + } + + if ( element1.hasAttributes() != element2.hasAttributes() ) + { + qDebug( "Different hasAttributes: %s, %s", tag1.toAscii().data(), tag2.toAscii().data() ); + return false; + } + + if ( element1.hasAttributes() ) + { + QDomNamedNodeMap attrs1 = element1.attributes(); + QDomNamedNodeMap attrs2 = element2.attributes(); + + if ( attrs1.size() != attrs2.size() ) + { + qDebug( "Different attributes size: %s, %s", tag1.toAscii().data(), tag2.toAscii().data() ); + return false; + } + + for ( int i = 0 ; i < attrs1.size() ; ++i ) + { + QDomNode node1 = attrs1.item( i ); + QDomAttr attr1 = node1.toAttr(); + + if ( !element2.hasAttribute( attr1.name() ) ) + { + qDebug( "Element2 has not attribute: %s, %s, %s", tag1.toAscii().data(), tag2.toAscii().data(), attr1.name().toAscii().data() ); + return false; + } + + if ( element2.attribute( attr1.name() ) != attr1.value() ) + { + qDebug( "Element2 attribute has not the same value: %s, %s, %s", tag1.toAscii().data(), tag2.toAscii().data(), attr1.name().toAscii().data() ); + return false; + } + } + } + + if ( element1.hasChildNodes() != element2.hasChildNodes() ) + { + qDebug( "Different childNodes: %s, %s", tag1.toAscii().data(), tag2.toAscii().data() ); + return false; + } + + if ( element1.hasChildNodes() ) + { + QDomNodeList nodes1 = element1.childNodes(); + QDomNodeList nodes2 = element2.childNodes(); + + if ( nodes1.size() != nodes2.size() ) + { + qDebug( "Different childNodes size: %s, %s", tag1.toAscii().data(), tag2.toAscii().data() ); + return false; + } + + for ( int i = 0 ; i < nodes1.size() ; ++i ) + { + QDomNode node1 = nodes1.at( i ); + QDomNode node2 = nodes2.at( i ); + if ( node1.isElement() && node2.isElement() ) + { + QDomElement elt1 = node1.toElement(); + QDomElement elt2 = node2.toElement(); + + if ( !compareElements( elt1, elt2 ) ) + return false; + } + else if ( node1.isText() && node2.isText() ) + { + QDomText txt1 = node1.toText(); + QDomText txt2 = node2.toText(); + + if ( txt1.data() != txt2.data() ) + { + qDebug( "Different text data: %s %s", tag1.toAscii().data(), txt1.data().toAscii().data() ); + qDebug( "Different text data: %s %s", tag2.toAscii().data(), txt2.data().toAscii().data() ); + return false; + } + } + } + } + + if ( element1.text() != element2.text() ) + { + qDebug( "Different text: %s %s", tag1.toAscii().data(), element1.text().toAscii().data() ); + qDebug( "Different text: %s %s", tag2.toAscii().data(), element2.text().toAscii().data() ); + return false; + } + + return true; +} +static QDomElement comparableElement( const QString& xmlText ) +{ + QDomDocument doc; + if ( !doc.setContent( xmlText ) ) + return QDomElement(); + return doc.documentElement(); +} + + void TestQgsOgcUtils::testGeometryToGML() { QDomDocument doc; QgsGeometry geomPoint( QgsGeometry::fromPoint( QgsPoint( 111, 222 ) ) ); QgsGeometry geomLine( QgsGeometry::fromWkt( "LINESTRING(111 222, 222 222)" ) ); + // Elements to compare + QDomElement xmlElem; + QDomElement ogcElem; + // Test GML2 QDomElement elemInvalid = QgsOgcUtils::geometryToGML( 0, doc ); QVERIFY( elemInvalid.isNull() ); @@ -107,14 +221,18 @@ void TestQgsOgcUtils::testGeometryToGML() QVERIFY( !elemPoint.isNull() ); doc.appendChild( elemPoint ); - QCOMPARE( doc.toString( -1 ), QString( "111,222" ) ); + xmlElem = comparableElement( QString( "111,222" ) ); + ogcElem = comparableElement( doc.toString( -1 ) ); + QVERIFY( compareElements( xmlElem, ogcElem ) ); doc.removeChild( elemPoint ); QDomElement elemLine = QgsOgcUtils::geometryToGML( &geomLine, doc ); QVERIFY( !elemLine.isNull() ); doc.appendChild( elemLine ); - QCOMPARE( doc.toString( -1 ), QString( "111,222 222,222" ) ); + xmlElem = comparableElement( QString( "111,222 222,222" ) ); + ogcElem = comparableElement( doc.toString( -1 ) ); + QVERIFY( compareElements( xmlElem, ogcElem ) ); doc.removeChild( elemLine ); // Test GML3 @@ -125,14 +243,18 @@ void TestQgsOgcUtils::testGeometryToGML() QVERIFY( !elemPoint.isNull() ); doc.appendChild( elemPoint ); - QCOMPARE( doc.toString( -1 ), QString( "111 222" ) ); + xmlElem = comparableElement( QString( "111 222" ) ); + ogcElem = comparableElement( doc.toString( -1 ) ); + QVERIFY( compareElements( xmlElem, ogcElem ) ); doc.removeChild( elemPoint ); elemLine = QgsOgcUtils::geometryToGML( &geomLine, doc, "GML3" ); QVERIFY( !elemLine.isNull() ); doc.appendChild( elemLine ); - QCOMPARE( doc.toString( -1 ), QString( "111 222 222 222" ) ); + xmlElem = comparableElement( QString( "111 222 222 222" ) ); + ogcElem = comparableElement( doc.toString( -1 ) ); + QVERIFY( compareElements( xmlElem, ogcElem ) ); doc.removeChild( elemLine ); } @@ -287,7 +409,10 @@ void TestQgsOgcUtils::testExpressionToOgcFilter() qDebug( "EXPR: %s", exp.expression().toAscii().data() ); qDebug( "OGC : %s", doc.toString( -1 ).toAscii().data() ); - QCOMPARE( xmlText, doc.toString( -1 ) ); + + QDomElement xmlElem = comparableElement( xmlText ); + QDomElement ogcElem = comparableElement( doc.toString( -1 ) ); + QVERIFY( compareElements( xmlElem, ogcElem ) ); } void TestQgsOgcUtils::testExpressionToOgcFilter_data() @@ -449,7 +574,10 @@ void TestQgsOgcUtils::testExpressionToOgcFilterWFS11() qDebug( "SRSNAME: %s", srsName.toAscii().data() ); qDebug( "OGC : %s", doc.toString( -1 ).toAscii().data() ); - QCOMPARE( xmlText, doc.toString( -1 ) ); + + QDomElement xmlElem = comparableElement( xmlText ); + QDomElement ogcElem = comparableElement( doc.toString( -1 ) ); + QVERIFY( compareElements( xmlElem, ogcElem ) ); } void TestQgsOgcUtils::testExpressionToOgcFilterWFS11_data() @@ -473,14 +601,6 @@ void TestQgsOgcUtils::testExpressionToOgcFilterWFS11_data() "" ); } -static QString normalizeXML( const QString& xmlText ) -{ - QDomDocument doc; - if ( !doc.setContent( xmlText, true ) ) - return QString(); - return doc.toString( -1 ); -} - void TestQgsOgcUtils::testExpressionToOgcFilterWFS20() { QFETCH( QString, exprText ); @@ -506,15 +626,9 @@ void TestQgsOgcUtils::testExpressionToOgcFilterWFS20() qDebug( "SRSNAME: %s", srsName.toAscii().data() ); qDebug( "OGC : %s", doc.toString( -1 ).toAscii().data() ); - QString normalizedExpected( normalizeXML( xmlText ) ); - QString normalizedGot( normalizeXML( doc.toString( -1 ) ) ); - - if ( normalizedExpected != normalizedGot ) - { - qDebug( "Normalized expected: %s", normalizedExpected.toAscii().data() ); - qDebug( "Normalized got: %s", normalizedGot.toAscii().data() ); - } - QCOMPARE( normalizedExpected, normalizedGot ); + QDomElement xmlElem = comparableElement( xmlText ); + QDomElement ogcElem = comparableElement( doc.toString( -1 ) ); + QVERIFY( compareElements( xmlElem, ogcElem ) ); } void TestQgsOgcUtils::testExpressionToOgcFilterWFS20_data() @@ -614,15 +728,9 @@ void TestQgsOgcUtils::testSQLStatementToOgcFilter() filterVersion == QgsOgcUtils::FILTER_FES_2_0 ? "FES 2.0" : "unknown" ); qDebug( "OGC : %s", doc.toString( -1 ).toAscii().data() ); - QString normalizedExpected( normalizeXML( xmlText ) ); - QString normalizedGot( normalizeXML( doc.toString( -1 ) ) ); - - if ( normalizedExpected != normalizedGot ) - { - qDebug( "Normalized expected: %s", normalizedExpected.toAscii().data() ); - qDebug( "Normalized got: %s", normalizedGot.toAscii().data() ); - } - QCOMPARE( normalizedExpected, normalizedGot ); + QDomElement xmlElem = comparableElement( xmlText ); + QDomElement ogcElem = comparableElement( doc.toString( -1 ) ); + QVERIFY( compareElements( xmlElem, ogcElem ) ); } void TestQgsOgcUtils::testSQLStatementToOgcFilter_data()