diff options
Diffstat (limited to 'tests/auto/xml')
-rw-r--r-- | tests/auto/xml/CMakeLists.txt | 2 | ||||
-rw-r--r-- | tests/auto/xml/dom/CMakeLists.txt | 4 | ||||
-rw-r--r-- | tests/auto/xml/dom/qdom/CMakeLists.txt | 11 | ||||
-rw-r--r-- | tests/auto/xml/dom/qdom/tst_qdom.cpp | 139 |
4 files changed, 99 insertions, 57 deletions
diff --git a/tests/auto/xml/CMakeLists.txt b/tests/auto/xml/CMakeLists.txt index 4b8cc88d78..92ac1870f6 100644 --- a/tests/auto/xml/CMakeLists.txt +++ b/tests/auto/xml/CMakeLists.txt @@ -1 +1,3 @@ +# Copyright (C) 2024 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(dom) diff --git a/tests/auto/xml/dom/CMakeLists.txt b/tests/auto/xml/dom/CMakeLists.txt index a19aa5c576..daa837c2cf 100644 --- a/tests/auto/xml/dom/CMakeLists.txt +++ b/tests/auto/xml/dom/CMakeLists.txt @@ -1,6 +1,4 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -# Generated from dom.pro. +# SPDX-License-Identifier: BSD-3-Clause add_subdirectory(qdom) diff --git a/tests/auto/xml/dom/qdom/CMakeLists.txt b/tests/auto/xml/dom/qdom/CMakeLists.txt index 98e0139b2a..4eea988cc3 100644 --- a/tests/auto/xml/dom/qdom/CMakeLists.txt +++ b/tests/auto/xml/dom/qdom/CMakeLists.txt @@ -1,12 +1,16 @@ # Copyright (C) 2022 The Qt Company Ltd. -# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -# Generated from qdom.pro. +# SPDX-License-Identifier: BSD-3-Clause ##################################################################### ## tst_qdom Test: ##################################################################### +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qdom LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + # Collect test data file(GLOB_RECURSE test_data_glob RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} @@ -20,5 +24,6 @@ qt_internal_add_test(tst_qdom tst_qdom.cpp LIBRARIES Qt::Xml + Qt::XmlPrivate TESTDATA ${test_data} ) diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index 71c65ea78d..b73dbc49e2 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -1,5 +1,5 @@ // Copyright (C) 2016 The Qt Company Ltd. -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include <QBuffer> @@ -15,6 +15,7 @@ #include <QtXml> #include <QVariant> #include <cmath> +#include <QtXml/private/qdom_p.h> QT_FORWARD_DECLARE_CLASS(QDomDocument) QT_FORWARD_DECLARE_CLASS(QDomNode) @@ -105,6 +106,8 @@ private slots: void DTDInternalSubset() const; void DTDInternalSubset_data() const; void QTBUG49113_dontCrashWithNegativeIndex() const; + void standalone(); + void splitTextLeakMemory() const; void cleanupTestCase() const; @@ -178,7 +181,11 @@ void tst_QDom::setContent() QDomDocument domDoc; QXmlStreamReader reader(doc); - QVERIFY(domDoc.setContent(&reader, true)); +#if QT_DEPRECATED_SINCE(6, 8) + QT_IGNORE_DEPRECATIONS(domDoc.setContent(&reader, true);) +#else + QVERIFY(domDoc.setContent(&reader, QDomDocument::ParseOption::UseNamespaceProcessing)); +#endif // QT_DEPRECATED_SINCE(6, 8) QString eRes; QTextStream ts( &eRes, QIODevice::WriteOnly ); @@ -240,6 +247,9 @@ void tst_QDom::setContentOverloads() QVERIFY(doc.setContent(&buffer, QDomDocument::ParseOption::Default)); buffer.reset(); +#if QT_DEPRECATED_SINCE(6, 8) +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED // With output param QVERIFY(doc.setContent(data, &errorMessage)); QVERIFY(doc.setContent(text, &errorMessage)); @@ -261,6 +271,8 @@ void tst_QDom::setContentOverloads() QVERIFY(doc.setContent(&reader, false, &errorMessage)); QVERIFY(doc.setContent(&buffer, false, &errorMessage)); buffer.reset(); +QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) } void tst_QDom::parseOptions() @@ -409,13 +421,11 @@ void tst_QDom::toString_01() QVERIFY2(f.open(QIODevice::ReadOnly), qPrintable(QString::fromLatin1("Failed to open file %1, file error: %2").arg(fileName).arg(f.error()))); QDomDocument doc; - QString errorMsg; - int errorLine; - int errorCol; - - QVERIFY(doc.setContent( &f, &errorMsg, &errorLine, &errorCol )); /*, - QString("QDomDocument::setContent() failed: %1 in line %2, column %3") - .arg( errorMsg ).arg( errorLine ).arg( errorCol )); */ + QDomDocument::ParseResult result = doc.setContent(&f, QDomDocument::ParseOption::Default); + QVERIFY2(result, + qPrintable(u"QDomDocument::setContent() failed (%1:%2): %3"_s.arg(result.errorLine) + .arg(result.errorColumn) + .arg(result.errorMessage))); // test toString()'s invariant with different indenting depths for ( int i=0; i<5; i++ ) { QString toStr = doc.toString( i ); @@ -675,17 +685,14 @@ void tst_QDom::saveWithSerialization() const QVERIFY(readDevice.open(QIODevice::ReadOnly)); QDomDocument result; + QDomDocument::ParseResult parseResult = + result.setContent(&readDevice, QDomDocument::ParseOption::Default); - QString msg; - int line = 0; - int column = 0; - - QVERIFY2(result.setContent(&readDevice, &msg, &line, &column), + QVERIFY2(parseResult, qPrintable(QString::fromLatin1("Failed: line %2, column %3: %4, content: %5") - .arg(QString::number(line), - QString::number(column), - msg, - QString::fromUtf8(storage)))); + .arg(QString::number(parseResult.errorLine), + QString::number(parseResult.errorColumn), + parseResult.errorMessage, QString::fromUtf8(storage)))); if (!compareDocuments(doc, result)) { QCOMPARE(doc.toString(), result.toString()); @@ -1584,12 +1591,10 @@ void tst_QDom::nonBMPCharacters() [invalidDataPolicy] { QDomImplementation::setInvalidDataPolicy(invalidDataPolicy); }); QDomImplementation::setInvalidDataPolicy(QDomImplementation::DropInvalidChars); - const QString input = u"<text>Supplementary Plane: 𝄞 😂 🀄 🀶 🃪 🃋</text>"_qs; + const QString input = u"<text>Supplementary Plane: 𝄞 😂 🀄 🀶 🃪 🃋</text>"_s; - QString errorMsg; QDomDocument doc; - doc.setContent(input, &errorMsg); - QVERIFY(errorMsg.isEmpty()); + QVERIFY(doc.setContent(input, QDomDocument::ParseOption::Default)); QCOMPARE(doc.toString(-1), input); } @@ -1631,10 +1636,8 @@ void tst_QDom::roundTripCDATA() const { const QString input = u"<?xml version='1.0' encoding='UTF-8'?>\n" "<content><![CDATA[]]></content>\n"_s; - QString errorMsg; QDomDocument doc; - QVERIFY(doc.setContent(input, false, &errorMsg)); - QVERIFY(errorMsg.isEmpty()); + QVERIFY(doc.setContent(input, QDomDocument::ParseOption::Default)); QCOMPARE(doc.toString(), input); } @@ -1646,7 +1649,7 @@ void tst_QDom::normalizeEndOfLine() const QVERIFY(buffer.open(QIODevice::ReadOnly)); QDomDocument doc; - QVERIFY(doc.setContent(&buffer, true)); + QVERIFY(doc.setContent(&buffer, QDomDocument::ParseOption::UseNamespaceProcessing)); const QString expected(QLatin1String("<a>\nc\nc\na\na</a>")); @@ -1663,7 +1666,7 @@ void tst_QDom::normalizeAttributes() const QVERIFY(buffer.open(QIODevice::ReadOnly)); QDomDocument doc; - QVERIFY(doc.setContent(&buffer, true)); + QVERIFY(doc.setContent(&buffer, QDomDocument::ParseOption::UseNamespaceProcessing)); QCOMPARE(doc.documentElement().attribute(QLatin1String("attribute")), QString::fromLatin1("a a")); } @@ -1707,17 +1710,18 @@ void tst_QDom::serializeNamespaces() const QDomDocument doc; QByteArray ba(input); QXmlStreamReader streamReader(input); - QVERIFY(doc.setContent(&streamReader, true)); + QVERIFY(doc.setContent(&streamReader, QDomDocument::ParseOption::UseNamespaceProcessing)); const QByteArray serialized(doc.toByteArray()); QDomDocument doc2; - QVERIFY(doc2.setContent(doc.toString(), true)); + QVERIFY(doc2.setContent(doc.toString(), QDomDocument::ParseOption::UseNamespaceProcessing)); /* Here we test that it roundtrips. */ QVERIFY(isDeepEqual(doc2, doc)); QDomDocument doc3; - QVERIFY(doc3.setContent(QString::fromLatin1(serialized.constData()), true)); + QVERIFY(doc3.setContent(QString::fromLatin1(serialized.constData()), + QDomDocument::ParseOption::UseNamespaceProcessing)); QVERIFY(isDeepEqual(doc3, doc)); } @@ -1743,7 +1747,7 @@ void tst_QDom::flagUndeclaredNamespace() const QDomDocument doc; QByteArray ba(input); QXmlStreamReader streamReader(ba); - QVERIFY(!doc.setContent(&streamReader, true)); + QVERIFY(!doc.setContent(&streamReader, QDomDocument::ParseOption::UseNamespaceProcessing)); } void tst_QDom::indentComments() const @@ -1825,12 +1829,12 @@ void tst_QDom::namespacedAttributes() const "</xan:td>\n"; QDomDocument one("document"); - QString error; - bool docParsed = one.setContent(QByteArray(xml), true, &error); - QVERIFY2(docParsed, qPrintable(error)); + QDomDocument::ParseResult result = + one.setContent(QByteArray(xml), QDomDocument::ParseOption::UseNamespaceProcessing); + QVERIFY2(result, qPrintable(result.errorMessage)); QDomDocument two("document2"); - docParsed = two.setContent(one.toByteArray(2), true, &error); - QVERIFY2(docParsed, qPrintable(error)); + result = two.setContent(one.toByteArray(2), QDomDocument::ParseOption::UseNamespaceProcessing); + QVERIFY2(result, qPrintable(result.errorMessage)); QVERIFY(isDeepEqual(one, two)); } @@ -1948,7 +1952,7 @@ void tst_QDom::germanUmlautToFile() const QString name(QLatin1String("german")); name += QChar(0xFC); name += QLatin1String("umlaut"); - QCOMPARE(name.length(), 13); + QCOMPARE(name.size(), 13); QDomDocument d("test"); d.appendChild(d.createElement(name)); @@ -1967,7 +1971,7 @@ void tst_QDom::germanUmlautToFile() const const QByteArray in(inFile.readAll()); /* Check that it was wwritten out correctly. */ - QCOMPARE(in.length(), 34); + QCOMPARE(in.size(), 34); QCOMPARE(in, baseline.toUtf8()); inFile.close(); @@ -1992,7 +1996,8 @@ void tst_QDom::crashInSetContent() const QDomImplementation::setInvalidDataPolicy(QDomImplementation::ReturnNullNode); QDomDocument docImport; - QCOMPARE(docImport.setContent(QLatin1String("<a:>text</a:>"), true), false); + QVERIFY(!docImport.setContent(QLatin1String("<a:>text</a:>"), + QDomDocument::ParseOption::UseNamespaceProcessing)); QVERIFY(docImport.setContent(QLatin1String("<?xml version=\"1.0\"?><e/>"))); } @@ -2007,24 +2012,17 @@ void tst_QDom::doubleNamespaceDeclarations() const QVERIFY(file.open(QIODevice::ReadOnly)); QXmlStreamReader streamReader(&file); - QVERIFY(doc.setContent(&streamReader, true)); + QVERIFY(doc.setContent(&streamReader, QDomDocument::ParseOption::UseNamespaceProcessing)); - // tst_QDom relies on a specific QHash ordering, see QTBUG-25071 QString docAsString = doc.toString(0); - QVERIFY(docAsString == QString::fromLatin1("<a>\n<b p:c=\"\" xmlns:p=\"NS\" p:d=\"\"/>\n</a>\n") || - docAsString == QString::fromLatin1("<a>\n<b p:c=\"\" p:d=\"\" xmlns:p=\"NS\"/>\n</a>\n") || - docAsString == QString::fromLatin1("<a>\n<b p:d=\"\" p:c=\"\" xmlns:p=\"NS\"/>\n</a>\n") || - docAsString == QString::fromLatin1("<a>\n<b p:d=\"\" xmlns:p=\"NS\" p:c=\"\"/>\n</a>\n") || - docAsString == QString::fromLatin1("<a>\n<b xmlns:p=\"NS\" p:c=\"\" p:d=\"\"/>\n</a>\n") || - docAsString == QString::fromLatin1("<a>\n<b xmlns:p=\"NS\" p:d=\"\" p:c=\"\"/>\n</a>\n") - ); + QCOMPARE(docAsString, "<a>\n<b p:c=\"\" p:d=\"\" xmlns:p=\"NS\"/>\n</a>\n"); } void tst_QDom::setContentQXmlReaderOverload() const { QDomDocument doc; QXmlStreamReader streamReader(QByteArray("<e/>")); - doc.setContent(&streamReader, true); + doc.setContent(&streamReader, QDomDocument::ParseOption::UseNamespaceProcessing); QCOMPARE(doc.documentElement().nodeName(), QString::fromLatin1("e")); } @@ -2130,7 +2128,7 @@ void tst_QDom::setContentUnopenedQIODevice() const // Note: the check below is expected to fail in Qt 7. // Fix the test and remove the obsolete code from setContent(). - QVERIFY(doc.setContent(&buffer, true)); + QVERIFY(doc.setContent(&buffer, QDomDocument::ParseOption::UseNamespaceProcessing)); QCOMPARE(doc.toString().trimmed(), data); } @@ -2230,13 +2228,38 @@ void tst_QDom::QTBUG49113_dontCrashWithNegativeIndex() const QVERIFY(node.isNull()); } +void tst_QDom::standalone() +{ + { + QDomDocument doc; + const QString dtd("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" + "<Test/>\n"); + doc.setContent(dtd); + QVERIFY(doc.toString().contains("standalone=\'no\'")); + } + { + QDomDocument doc; + const QString dtd("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<Test/>\n"); + doc.setContent(dtd); + QVERIFY(!doc.toString().contains("standalone")); + } + { + QDomDocument doc; + const QString dtd("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" + "<Test/>\n"); + doc.setContent(dtd); + QVERIFY(doc.toString().contains("standalone=\'yes\'")); + } +} + void tst_QDom::DTDInternalSubset() const { QFETCH( QString, doc ); QFETCH( QString, internalSubset ); QXmlStreamReader reader(doc); QDomDocument document; - QVERIFY(document.setContent(&reader, true)); + QVERIFY(document.setContent(&reader, QDomDocument::ParseOption::UseNamespaceProcessing)); QCOMPARE(document.doctype().internalSubset(), internalSubset); } @@ -2294,5 +2317,19 @@ void tst_QDom::DTDInternalSubset_data() const << internalSubset0; } +void tst_QDom::splitTextLeakMemory() const +{ + QDomDocument doc; + QDomElement top = doc.createElement("top"); + QDomText text = doc.createTextNode("abcdefgh"); + top.appendChild(text); + QDomText end = text.splitText(2); + QCOMPARE(text.data(), "ab"_L1); + QCOMPARE(end.data(), "cdefgh"_L1); + // only the parent node and the document have a reference on the nodes + QCOMPARE(text.impl->ref.loadRelaxed(), 2); + QCOMPARE(end.impl->ref.loadRelaxed(), 2); +} + QTEST_MAIN(tst_QDom) #include "tst_qdom.moc" |