From d7cb21ac085117f879a8aa1d7727b2ca52d3353d Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Fri, 15 Nov 2019 21:46:32 +0100 Subject: QDom: use QLocale::C when converting a double to a xml attribute QDomElement::setAttribute(QString, double) did not use QString::setNum() but qsnprintf(). This is wrong because qsnprintf() is using the current locale instead QLocale::C. It was also inconsistent to QDomElement::setAttributeNS() which was already using QString::setNum(). Also fix the documentation which stated that all QDomElement::setAttribute() format the values according the current locale. Fixes: QTBUG-80068 Change-Id: Iabb0b39c0d0723060527542c283a5435f26f31ca Reviewed-by: Thiago Macieira --- tests/auto/xml/dom/qdom/tst_qdom.cpp | 69 ++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) (limited to 'tests/auto/xml/dom/qdom') diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index b09a3447e3..99639df5b0 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -57,6 +57,7 @@ private slots: void toString_02(); void hasAttributes_data(); void hasAttributes(); + void setGetAttributes(); void save_data(); void save(); void saveWithSerialization() const; @@ -392,6 +393,74 @@ void tst_QDom::hasAttributes() QTEST( visitedNodes, "visitedNodes" ); } +void tst_QDom::setGetAttributes() +{ + QDomDocument doc; + QDomElement rootNode = doc.createElement("Root"); + doc.appendChild(rootNode); + + const QLocale oldLocale = QLocale(); + QLocale::setDefault(QLocale::German); // decimal separator != '.' + + const QString qstringVal("QString"); + const qlonglong qlonglongVal = std::numeric_limits::min(); + const qulonglong qulonglongVal = std::numeric_limits::max(); + const int intVal = std::numeric_limits::min(); + const uint uintVal = std::numeric_limits::max(); + const float floatVal = 0.1234f; + const double doubleVal = 0.1234; + + rootNode.setAttribute("qstringVal", qstringVal); + rootNode.setAttribute("qlonglongVal", qlonglongVal); + rootNode.setAttribute("qulonglongVal", qulonglongVal); + rootNode.setAttribute("intVal", intVal); + rootNode.setAttribute("uintVal", uintVal); + rootNode.setAttribute("floatVal", floatVal); + rootNode.setAttribute("doubleVal", doubleVal); + + QDomElement nsNode = doc.createElement("NS"); + rootNode.appendChild(nsNode); + nsNode.setAttributeNS("namespace", "qstringVal", qstringVal); + nsNode.setAttributeNS("namespace", "qlonglongVal", qlonglongVal); + nsNode.setAttributeNS("namespace", "qulonglongVal", qulonglongVal); + nsNode.setAttributeNS("namespace", "intVal", intVal); + nsNode.setAttributeNS("namespace", "uintVal", uintVal); + nsNode.setAttributeNS("namespace", "floatVal", floatVal); // not available atm + nsNode.setAttributeNS("namespace", "doubleVal", doubleVal); + + bool bOk; + QCOMPARE(rootNode.attribute("qstringVal"), qstringVal); + QCOMPARE(rootNode.attribute("qlonglongVal").toLongLong(&bOk), qlonglongVal); + QVERIFY(bOk); + QCOMPARE(rootNode.attribute("qulonglongVal").toULongLong(&bOk), qulonglongVal); + QVERIFY(bOk); + QCOMPARE(rootNode.attribute("intVal").toInt(&bOk), intVal); + QVERIFY(bOk); + QCOMPARE(rootNode.attribute("uintVal").toUInt(&bOk), uintVal); + QVERIFY(bOk); + QCOMPARE(rootNode.attribute("floatVal").toFloat(&bOk), floatVal); + QVERIFY(bOk); + QCOMPARE(rootNode.attribute("doubleVal").toDouble(&bOk), doubleVal); + QVERIFY(bOk); + + QCOMPARE(nsNode.attributeNS("namespace", "qstringVal"), qstringVal); + QCOMPARE(nsNode.attributeNS("namespace", "qlonglongVal").toLongLong(&bOk), qlonglongVal); + QVERIFY(bOk); + QCOMPARE(nsNode.attributeNS("namespace", "qulonglongVal").toULongLong(&bOk), qulonglongVal); + QVERIFY(bOk); + QCOMPARE(nsNode.attributeNS("namespace", "intVal").toInt(&bOk), intVal); + QVERIFY(bOk); + QCOMPARE(nsNode.attributeNS("namespace", "uintVal").toUInt(&bOk), uintVal); + QVERIFY(bOk); + QCOMPARE(nsNode.attributeNS("namespace", "floatVal").toFloat(&bOk), floatVal); + QVERIFY(bOk); + QCOMPARE(nsNode.attributeNS("namespace", "doubleVal").toDouble(&bOk), doubleVal); + QVERIFY(bOk); + + QLocale::setDefault(oldLocale); +} + + int tst_QDom::hasAttributesHelper( const QDomNode& node ) { int visitedNodes = 1; -- cgit v1.2.3 From ccc2133c648ca531630095f3f1016e2026d7e34e Mon Sep 17 00:00:00 2001 From: Sona Kurazyan Date: Fri, 25 Oct 2019 12:05:27 +0200 Subject: Port QDomDocument to QXmlStreamReader Reimplement QDomDocument using QXmlStreamReader and switch to the new implementation starting from Qt 6. The changes in the behavior are reflected in tests: some test cases which were marked as "expected to fail" are now passing. Task-number: QTBUG-76178 Change-Id: I5ace2f13c036a9a778de922b47a1ce35957ce5f6 Reviewed-by: Kai Koehne --- tests/auto/xml/dom/qdom/tst_qdom.cpp | 48 +++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-) (limited to 'tests/auto/xml/dom/qdom') diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index 99639df5b0..ab62307704 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -173,6 +173,8 @@ void tst_QDom::setContent_data() " \n" "\n"); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + // These configurations cannot be supported by the QXmlStreamReader-based implementation QTest::newRow( "02" ) << doc01 << QString("http://trolltech.com/xml/features/report-whitespace-only-CharData").split(' ') << QStringList() @@ -227,6 +229,7 @@ void tst_QDom::setContent_data() " \n" " \n" "\n"); +#endif QTest::newRow("05") << QString("\n" " <b>foo</b>>]]>\n" @@ -242,6 +245,8 @@ void tst_QDom::setContent() { QFETCH( QString, doc ); + QDomDocument domDoc; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QXmlInputSource source; source.setData( doc ); @@ -258,8 +263,11 @@ void tst_QDom::setContent() reader.setFeature( *it, false ); } - QDomDocument domDoc; QVERIFY( domDoc.setContent( &source, &reader ) ); +#else + QXmlStreamReader reader(doc); + QVERIFY(domDoc.setContent(&reader, true)); +#endif QString eRes; QTextStream ts( &eRes, QIODevice::WriteOnly ); @@ -1475,8 +1483,9 @@ void tst_QDom::normalizeAttributes() const QDomDocument doc; QVERIFY(doc.setContent(&buffer, true)); - // ### Qt 5: fix this, if we keep QDom at all +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QEXPECT_FAIL("", "The parser doesn't perform Attribute Value Normalization. Fixing that would change behavior.", Continue); +#endif QCOMPARE(doc.documentElement().attribute(QLatin1String("attribute")), QString::fromLatin1("a a")); } @@ -1517,9 +1526,10 @@ void tst_QDom::serializeNamespaces() const "" ""; + QDomDocument doc; QByteArray ba(input); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QBuffer buffer(&ba); - QVERIFY(buffer.open(QIODevice::ReadOnly)); QXmlInputSource source(&buffer); @@ -1527,8 +1537,11 @@ void tst_QDom::serializeNamespaces() const reader.setFeature("http://xml.org/sax/features/namespaces", true); reader.setFeature("http://xml.org/sax/features/namespace-prefixes", false); - QDomDocument doc; QVERIFY(doc.setContent(&source, &reader)); +#else + QXmlStreamReader streamReader(input); + QVERIFY(doc.setContent(&streamReader, true)); +#endif const QByteArray serialized(doc.toByteArray()); @@ -1552,7 +1565,9 @@ void tst_QDom::flagInvalidNamespaces() const QDomDocument doc; QVERIFY(!doc.setContent(QString::fromLatin1(input, true))); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QEXPECT_FAIL("", "The parser doesn't flag identical qualified attribute names. Fixing this would change behavior.", Continue); +#endif QVERIFY(!doc.setContent(QString::fromLatin1(input))); } @@ -1563,7 +1578,9 @@ void tst_QDom::flagUndeclaredNamespace() const "" ""; + QDomDocument doc; QByteArray ba(input); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QBuffer buffer(&ba); QVERIFY(buffer.open(QIODevice::ReadOnly)); @@ -1573,9 +1590,12 @@ void tst_QDom::flagUndeclaredNamespace() const reader.setFeature("http://xml.org/sax/features/namespaces", true); reader.setFeature("http://xml.org/sax/features/namespace-prefixes", false); - QDomDocument doc; QEXPECT_FAIL("", "The parser doesn't flag not declared prefixes. Fixing this would change behavior.", Continue); QVERIFY(!doc.setContent(&source, &reader)); +#else + QXmlStreamReader streamReader(ba); + QVERIFY(!doc.setContent(&streamReader, true)); +#endif } void tst_QDom::indentComments() const @@ -1642,7 +1662,9 @@ void tst_QDom::reportDuplicateAttributes() const QDomDocument dd; bool isSuccess = dd.setContent(QLatin1String("")); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QEXPECT_FAIL("", "The parser doesn't flag duplicate attributes. Fixing this would change behavior.", Continue); +#endif QVERIFY2(!isSuccess, "Duplicate attributes are well-formedness errors, and should be reported as such."); } @@ -1842,10 +1864,15 @@ void tst_QDom::doubleNamespaceDeclarations() const QFile file(testFile); QVERIFY(file.open(QIODevice::ReadOnly)); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QXmlSimpleReader reader; QXmlInputSource source(&file); QVERIFY(doc.setContent(&source, &reader)); +#else + QXmlStreamReader streamReader(&file); + QVERIFY(doc.setContent(&streamReader, true)); +#endif // tst_QDom relies on a specific QHash ordering, see QTBUG-25071 QString docAsString = doc.toString(0); @@ -1862,11 +1889,15 @@ void tst_QDom::setContentQXmlReaderOverload() const { QDomDocument doc; +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QXmlSimpleReader reader; QXmlInputSource data; data.setData(QByteArray("")); - doc.setContent(&data, true); +#else + QXmlStreamReader streamReader(QByteArray("")); + doc.setContent(&streamReader, true); +#endif QCOMPARE(doc.documentElement().nodeName(), QString::fromLatin1("e")); } @@ -1961,6 +1992,10 @@ void tst_QDom::setContentWhitespace_data() const void tst_QDom::taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() const { + // QXmlStreamReader fails to read XML documents with unknown encoding. It + // needs to be modified if we want to support this case with the QXmlStreamReader-based + // implementation. +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) QString xmlWithUnknownEncoding("" "" " How will this sentence be handled?" @@ -1970,6 +2005,7 @@ void tst_QDom::taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() co QString dontAssert = d.toString(); // this should not assert QVERIFY(true); +#endif } void tst_QDom::cloneDTD_QTBUG8398() const -- cgit v1.2.3 From 82d02b7b95908dec16e41c5af1c63579729c589b Mon Sep 17 00:00:00 2001 From: Sona Kurazyan Date: Thu, 7 Nov 2019 17:26:55 +0100 Subject: Deprecate SAX classes in Qt XML Deprecated the SAX classes and disabled or replaced their uses in tests if applicable. Removed the saxbookmarks example, no point in keeping examples for the deprecated code. [ChangeLog][QtXml] SAX classes are now deprecated. Use QXmlStreamReader, QXmlStreamWriter in QtCore instead. Task-number: QTBUG-76177 Change-Id: Ic171d62fa0527b0f36f94cf09a69586092269957 Reviewed-by: Friedemann Kleint Reviewed-by: Paul Wicking Reviewed-by: Kai Koehne --- tests/auto/xml/dom/qdom/tst_qdom.cpp | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'tests/auto/xml/dom/qdom') diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index ab62307704..a2a5b22cad 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -173,7 +173,7 @@ void tst_QDom::setContent_data() " \n" "\n"); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) // These configurations cannot be supported by the QXmlStreamReader-based implementation QTest::newRow( "02" ) << doc01 << QString("http://trolltech.com/xml/features/report-whitespace-only-CharData").split(' ') @@ -246,7 +246,9 @@ void tst_QDom::setContent() QFETCH( QString, doc ); QDomDocument domDoc; -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED QXmlInputSource source; source.setData( doc ); @@ -264,6 +266,7 @@ void tst_QDom::setContent() } QVERIFY( domDoc.setContent( &source, &reader ) ); +QT_WARNING_POP #else QXmlStreamReader reader(doc); QVERIFY(domDoc.setContent(&reader, true)); @@ -1483,7 +1486,7 @@ void tst_QDom::normalizeAttributes() const QDomDocument doc; QVERIFY(doc.setContent(&buffer, true)); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) QEXPECT_FAIL("", "The parser doesn't perform Attribute Value Normalization. Fixing that would change behavior.", Continue); #endif QCOMPARE(doc.documentElement().attribute(QLatin1String("attribute")), QString::fromLatin1("a a")); @@ -1528,7 +1531,10 @@ void tst_QDom::serializeNamespaces() const QDomDocument doc; QByteArray ba(input); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED + QBuffer buffer(&ba); QVERIFY(buffer.open(QIODevice::ReadOnly)); @@ -1538,6 +1544,7 @@ void tst_QDom::serializeNamespaces() const reader.setFeature("http://xml.org/sax/features/namespace-prefixes", false); QVERIFY(doc.setContent(&source, &reader)); +QT_WARNING_POP #else QXmlStreamReader streamReader(input); QVERIFY(doc.setContent(&streamReader, true)); @@ -1565,7 +1572,7 @@ void tst_QDom::flagInvalidNamespaces() const QDomDocument doc; QVERIFY(!doc.setContent(QString::fromLatin1(input, true))); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) QEXPECT_FAIL("", "The parser doesn't flag identical qualified attribute names. Fixing this would change behavior.", Continue); #endif QVERIFY(!doc.setContent(QString::fromLatin1(input))); @@ -1580,7 +1587,9 @@ void tst_QDom::flagUndeclaredNamespace() const QDomDocument doc; QByteArray ba(input); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED QBuffer buffer(&ba); QVERIFY(buffer.open(QIODevice::ReadOnly)); @@ -1592,6 +1601,7 @@ void tst_QDom::flagUndeclaredNamespace() const QEXPECT_FAIL("", "The parser doesn't flag not declared prefixes. Fixing this would change behavior.", Continue); QVERIFY(!doc.setContent(&source, &reader)); +QT_WARNING_POP #else QXmlStreamReader streamReader(ba); QVERIFY(!doc.setContent(&streamReader, true)); @@ -1662,7 +1672,7 @@ void tst_QDom::reportDuplicateAttributes() const QDomDocument dd; bool isSuccess = dd.setContent(QLatin1String("")); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) QEXPECT_FAIL("", "The parser doesn't flag duplicate attributes. Fixing this would change behavior.", Continue); #endif QVERIFY2(!isSuccess, "Duplicate attributes are well-formedness errors, and should be reported as such."); @@ -1864,11 +1874,14 @@ void tst_QDom::doubleNamespaceDeclarations() const QFile file(testFile); QVERIFY(file.open(QIODevice::ReadOnly)); -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED QXmlSimpleReader reader; QXmlInputSource source(&file); QVERIFY(doc.setContent(&source, &reader)); +QT_WARNING_POP #else QXmlStreamReader streamReader(&file); QVERIFY(doc.setContent(&streamReader, true)); @@ -1889,11 +1902,14 @@ void tst_QDom::setContentQXmlReaderOverload() const { QDomDocument doc; -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED QXmlSimpleReader reader; QXmlInputSource data; data.setData(QByteArray("")); doc.setContent(&data, true); +QT_WARNING_POP #else QXmlStreamReader streamReader(QByteArray("")); doc.setContent(&streamReader, true); @@ -1995,7 +2011,7 @@ void tst_QDom::taskQTBUG4595_dontAssertWhenDocumentSpecifiesUnknownEncoding() co // QXmlStreamReader fails to read XML documents with unknown encoding. It // needs to be modified if we want to support this case with the QXmlStreamReader-based // implementation. -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) && QT_DEPRECATED_SINCE(5, 15) QString xmlWithUnknownEncoding("" "" " How will this sentence be handled?" -- cgit v1.2.3