From 1d067db1287f71d3a1f9e47115db0669c8484873 Mon Sep 17 00:00:00 2001 From: Matthias Rauter Date: Thu, 30 Jan 2025 15:08:53 +0100 Subject: [PATCH] Extend testing of QDomListIterator In preparation of changing the random access iterator to a bidirectional iterator, the tests are extended to ensure complete test coverage. Task-number: QTBUG-132527 Change-Id: I8caf93417282631f7982cb12a82b39c00d67c913 Reviewed-by: Marc Mutz (cherry picked from commit e4bcd9f1cb0e787c9353589ea48dca6823592d41) Reviewed-by: Qt Cherry-pick Bot --- tests/auto/xml/dom/qdom/tst_qdom.cpp | 256 ++++++++++++++++++++++----- 1 file changed, 216 insertions(+), 40 deletions(-) diff --git a/tests/auto/xml/dom/qdom/tst_qdom.cpp b/tests/auto/xml/dom/qdom/tst_qdom.cpp index e267f8ae9d2..a2e7ab9024b 100644 --- a/tests/auto/xml/dom/qdom/tst_qdom.cpp +++ b/tests/auto/xml/dom/qdom/tst_qdom.cpp @@ -70,6 +70,9 @@ private slots: void domNodeMapAndList(); void domNodeListIterator(); void domNodeListReverseIterator(); + void domNodeListIteratorListFilteredByTag(); + void domNodeListReverseIteratorListFilteredByTag(); + void domNodeListIteratorEmptyList(); void nullDocument(); void invalidName_data(); @@ -1320,11 +1323,23 @@ void tst_QDom::domNodeListIterator() const auto xml = "" "" "" - "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" ""_L1; QDomDocument doc; QVERIFY(doc.setContent(xml)); - QDomNodeList list = doc.elementsByTagName("bar"); + QDomNodeList list = doc.childNodes().at(0).childNodes(); + + auto listSize = list.size(); + QCOMPARE(listSize, 3); QCOMPARE_EQ(list.begin(), list.begin()); QCOMPARE_EQ(list.end(), list.end()); @@ -1333,38 +1348,43 @@ void tst_QDom::domNodeListIterator() QCOMPARE_GE(list.end(), list.begin()); auto it = list.begin(); - it++; - ++it; - it++; + it += listSize; QVERIFY(it == list.end()); - it--; - --it; - it--; + it -= listSize; QVERIFY(it == list.begin()); - it += 3; + it = it + listSize; QVERIFY(it == list.end()); - it -= 3; + it = it - listSize; QVERIFY(it == list.begin()); - it = it + 3; - QVERIFY(it == list.end()); - it = it - 3; - QVERIFY(it == list.begin()); - it = 3 + it; + it = listSize + it; QVERIFY(it == list.end()); - QCOMPARE(list.size(), 3); + it = list.begin(); + for (int i = 0; i < listSize; i++, it++) + QVERIFY(*it == list.item(i)); + QVERIFY(it == list.end()); - for (int i = 0; i < list.size(); ++i) { - QCOMPARE(list.item(i).attributes().item(0).nodeValue().toInt(), i); + it = list.begin(); + for (int i = 0; i < listSize; i++, ++it) + QVERIFY(*it == list.item(i)); + QVERIFY(it == list.end()); + + it = list.end(); + for (int i = 0; i < listSize; i++) { + it--; + QVERIFY(*it == list.item(listSize - 1 - i)); + } + + it = list.end(); + for (int i = 0; i < listSize; i++) { + --it; + QVERIFY(*it == list.item(listSize - 1 - i)); } int i = 0; - for (auto iter = list.begin(); iter != list.end(); ++iter) - QCOMPARE(iter->attributes().item(0).nodeValue().toInt(), i++); - - int j = 0; - for (const auto &item : list) - QCOMPARE(item.attributes().item(0).nodeValue().toInt(), j++); + for (const auto &node : list) + QVERIFY(node == list.item(i++)); + QVERIFY(i == listSize); } void tst_QDom::domNodeListReverseIterator() @@ -1372,11 +1392,23 @@ void tst_QDom::domNodeListReverseIterator() const auto xml = "" "" "" - "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" ""_L1; QDomDocument doc; QVERIFY(doc.setContent(xml)); - QDomNodeList list = doc.elementsByTagName("bar"); + QDomNodeList list = doc.childNodes().at(0).childNodes(); + + auto listSize = list.size(); + QCOMPARE(listSize, 3); QCOMPARE_EQ(list.rbegin(), list.rbegin()); QCOMPARE_EQ(list.rend(), list.rend()); @@ -1385,32 +1417,176 @@ void tst_QDom::domNodeListReverseIterator() QCOMPARE_GE(list.rend(), list.rbegin()); auto it = list.rbegin(); - it++; - ++it; - it++; + it += listSize; QVERIFY(it == list.rend()); - it--; - --it; - it--; + it -= listSize; QVERIFY(it == list.rbegin()); - it += 3; + it = it + listSize; QVERIFY(it == list.rend()); - it -= 3; + it = it - listSize; QVERIFY(it == list.rbegin()); - it = it + 3; - QVERIFY(it == list.rend()); - it = it - 3; - QVERIFY(it == list.rbegin()); - it = 3 + it; + it = listSize + it; QVERIFY(it == list.rend()); + it = list.rbegin(); + for (int i = 0; i < listSize; i++, it++) + QVERIFY(*it == list.item(listSize - 1 - i)); + QVERIFY(it == list.rend()); + + it = list.rbegin(); + for (int i = 0; i < listSize; i++, ++it) + QVERIFY(*it == list.item(listSize - 1 - i)); + QVERIFY(it == list.rend()); + + it = list.rend(); + for (int i = 0; i < listSize; i++) { + it--; + QVERIFY(*it == list.item(i)); + } + + it = list.rend(); + for (int i = 0; i < listSize; i++) { + --it; + QVERIFY(*it == list.item(i)); + } +} + +void tst_QDom::domNodeListIteratorListFilteredByTag() +{ + const auto xml = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""_L1; + QDomDocument doc; + QVERIFY(doc.setContent(xml)); + QDomNodeList list = doc.elementsByTagName("bar"); + + auto listSize = list.size(); + QCOMPARE(listSize, 8); + + QCOMPARE_EQ(list.begin(), list.begin()); + QCOMPARE_EQ(list.end(), list.end()); + QCOMPARE_NE(list.begin(), list.end()); + + auto it = list.begin(); + for (int i = 0; i < listSize; i++, it++) + QVERIFY(*it == list.item(i)); + QVERIFY(it == list.end()); + + it = list.begin(); + for (int i = 0; i < listSize; i++, ++it) + QVERIFY(*it == list.item(i)); + QVERIFY(it == list.end()); + + for (int i = 0; i < listSize; i++) { + it--; + QVERIFY(*it == list.item(listSize - 1 - i)); + } + QVERIFY(it == list.begin()); + + it = list.end(); + for (int i = 0; i < listSize; i++) { + --it; + QVERIFY(*it == list.item(listSize - 1 - i)); + } + QVERIFY(it == list.begin()); + + for (int i = 0; i < listSize; ++i) + QCOMPARE(list.item(i).attributes().item(0).nodeValue().toInt(), i); + + int i = 0; + for (auto iter = list.begin(); iter != list.end(); ++iter) + QCOMPARE(iter->attributes().item(0).nodeValue().toInt(), i++); + QVERIFY(i == listSize); + + int j = 0; + for (const auto &item : list) + QCOMPARE(item.attributes().item(0).nodeValue().toInt(), j++); + QVERIFY(j == listSize); +} + +void tst_QDom::domNodeListReverseIteratorListFilteredByTag() +{ + const auto xml = "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""_L1; + QDomDocument doc; + QVERIFY(doc.setContent(xml)); + QDomNodeList list = doc.elementsByTagName("bar"); + + auto listSize = list.size(); + QCOMPARE(listSize, 8); + + QCOMPARE_EQ(list.rbegin(), list.rbegin()); + QCOMPARE_EQ(list.rend(), list.rend()); + QCOMPARE_NE(list.rbegin(), list.rend()); + + auto it = list.rbegin(); + for (int i = 0; i < listSize; i++, it++) + QVERIFY(*it == list.item(listSize - 1 - i)); + QVERIFY(it == list.rend()); + + it = list.rbegin(); + for (int i = 0; i < listSize; i++, ++it) + QVERIFY(*it == list.item(listSize - 1 - i)); + QVERIFY(it == list.rend()); + + for (int i = 0; i < listSize; i++) { + it--; + QVERIFY(*it == list.item(i)); + } + QVERIFY(it == list.rbegin()); + + it = list.rend(); + for (int i = 0; i < listSize; i++) { + --it; + QVERIFY(*it == list.item(i)); + } + QVERIFY(it == list.rbegin()); + #if __cplusplus >= 202002L // QTBUG-131933 - int i = 2; + int i = 0; + for (auto iter = list.rbegin(); iter != list.rend(); ++iter) { + QCOMPARE(iter->attributes().item(0).nodeValue().toInt(), listSize - ++i); + } + QVERIFY(i == listSize); + + i = listSize - 1; for (auto iter = list.rbegin(); iter != list.rend(); ++iter) QCOMPARE(iter->attributes().item(0).nodeValue().toInt(), i--); #endif } +void tst_QDom::domNodeListIteratorEmptyList() +{ + QDomNodeList list; + QCOMPARE(list.begin(), list.end()); + + QDomDocument doc; + list = doc.elementsByTagName("bar"); + QCOMPARE(list.begin(), list.end()); +} + // Verifies that a default-constructed QDomDocument is null, and that calling // any of the factory functions causes it to be non-null. #define TEST_NULL_DOCUMENT(func) \