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 <marc.mutz@qt.io>
(cherry picked from commit e4bcd9f1cb0e787c9353589ea48dca6823592d41)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Matthias Rauter 2025-01-30 15:08:53 +01:00 committed by Qt Cherry-pick Bot
parent 6446d865be
commit 1d067db128

View File

@ -70,6 +70,9 @@ private slots:
void domNodeMapAndList(); void domNodeMapAndList();
void domNodeListIterator(); void domNodeListIterator();
void domNodeListReverseIterator(); void domNodeListReverseIterator();
void domNodeListIteratorListFilteredByTag();
void domNodeListReverseIteratorListFilteredByTag();
void domNodeListIteratorEmptyList();
void nullDocument(); void nullDocument();
void invalidName_data(); void invalidName_data();
@ -1320,11 +1323,23 @@ void tst_QDom::domNodeListIterator()
const auto xml = "<foo>" const auto xml = "<foo>"
"<bar idx='0'></bar>" "<bar idx='0'></bar>"
"<bar idx='1'></bar>" "<bar idx='1'></bar>"
"<bar idx='2'></bar>" "<bar idx='2'>"
"<bar idx='3'></bar>"
"<bar idx='4'>"
"<bar idx='5'></bar>"
"</bar>"
"<bar idx='6'></bar>"
"<foo idx='-1'></foo>"
"<bar idx='7'></bar>"
"<foo idx='-1'></foo>"
"</bar>"
"</foo>"_L1; "</foo>"_L1;
QDomDocument doc; QDomDocument doc;
QVERIFY(doc.setContent(xml)); 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.begin(), list.begin());
QCOMPARE_EQ(list.end(), list.end()); QCOMPARE_EQ(list.end(), list.end());
@ -1333,38 +1348,43 @@ void tst_QDom::domNodeListIterator()
QCOMPARE_GE(list.end(), list.begin()); QCOMPARE_GE(list.end(), list.begin());
auto it = list.begin(); auto it = list.begin();
it++; it += listSize;
++it;
it++;
QVERIFY(it == list.end()); QVERIFY(it == list.end());
it--; it -= listSize;
--it;
it--;
QVERIFY(it == list.begin()); QVERIFY(it == list.begin());
it += 3; it = it + listSize;
QVERIFY(it == list.end()); QVERIFY(it == list.end());
it -= 3; it = it - listSize;
QVERIFY(it == list.begin()); QVERIFY(it == list.begin());
it = it + 3; it = listSize + it;
QVERIFY(it == list.end());
it = it - 3;
QVERIFY(it == list.begin());
it = 3 + it;
QVERIFY(it == list.end()); 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) { it = list.begin();
QCOMPARE(list.item(i).attributes().item(0).nodeValue().toInt(), i); 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; int i = 0;
for (auto iter = list.begin(); iter != list.end(); ++iter) for (const auto &node : list)
QCOMPARE(iter->attributes().item(0).nodeValue().toInt(), i++); QVERIFY(node == list.item(i++));
QVERIFY(i == listSize);
int j = 0;
for (const auto &item : list)
QCOMPARE(item.attributes().item(0).nodeValue().toInt(), j++);
} }
void tst_QDom::domNodeListReverseIterator() void tst_QDom::domNodeListReverseIterator()
@ -1372,11 +1392,23 @@ void tst_QDom::domNodeListReverseIterator()
const auto xml = "<foo>" const auto xml = "<foo>"
"<bar idx='0'></bar>" "<bar idx='0'></bar>"
"<bar idx='1'></bar>" "<bar idx='1'></bar>"
"<bar idx='2'></bar>" "<bar idx='2'>"
"<bar idx='3'></bar>"
"<bar idx='4'>"
"<bar idx='5'></bar>"
"</bar>"
"<bar idx='6'></bar>"
"<foo idx='-1'></foo>"
"<bar idx='7'></bar>"
"<foo idx='-1'></foo>"
"</bar>"
"</foo>"_L1; "</foo>"_L1;
QDomDocument doc; QDomDocument doc;
QVERIFY(doc.setContent(xml)); 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.rbegin(), list.rbegin());
QCOMPARE_EQ(list.rend(), list.rend()); QCOMPARE_EQ(list.rend(), list.rend());
@ -1385,32 +1417,176 @@ void tst_QDom::domNodeListReverseIterator()
QCOMPARE_GE(list.rend(), list.rbegin()); QCOMPARE_GE(list.rend(), list.rbegin());
auto it = list.rbegin(); auto it = list.rbegin();
it++; it += listSize;
++it;
it++;
QVERIFY(it == list.rend()); QVERIFY(it == list.rend());
it--; it -= listSize;
--it;
it--;
QVERIFY(it == list.rbegin()); QVERIFY(it == list.rbegin());
it += 3; it = it + listSize;
QVERIFY(it == list.rend()); QVERIFY(it == list.rend());
it -= 3; it = it - listSize;
QVERIFY(it == list.rbegin()); QVERIFY(it == list.rbegin());
it = it + 3; it = listSize + it;
QVERIFY(it == list.rend());
it = it - 3;
QVERIFY(it == list.rbegin());
it = 3 + it;
QVERIFY(it == list.rend()); 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 = "<foo>"
"<bar idx='0'></bar>"
"<bar idx='1'></bar>"
"<bar idx='2'>"
"<bar idx='3'></bar>"
"<bar idx='4'>"
"<bar idx='5'></bar>"
"</bar>"
"<bar idx='6'></bar>"
"<foo idx='-1'></foo>"
"<bar idx='7'></bar>"
"<foo idx='-1'></foo>"
"</bar>"
"</foo>"_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 = "<foo>"
"<bar idx='0'></bar>"
"<bar idx='1'></bar>"
"<bar idx='2'>"
"<bar idx='3'></bar>"
"<bar idx='4'>"
"<bar idx='5'></bar>"
"</bar>"
"<bar idx='6'></bar>"
"<foo idx='8'></foo>"
"<bar idx='7'></bar>"
"</bar>"
"</foo>"_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 #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) for (auto iter = list.rbegin(); iter != list.rend(); ++iter)
QCOMPARE(iter->attributes().item(0).nodeValue().toInt(), i--); QCOMPARE(iter->attributes().item(0).nodeValue().toInt(), i--);
#endif #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 // Verifies that a default-constructed QDomDocument is null, and that calling
// any of the factory functions causes it to be non-null. // any of the factory functions causes it to be non-null.
#define TEST_NULL_DOCUMENT(func) \ #define TEST_NULL_DOCUMENT(func) \