From c2edbc1a77b921a7a45def01cf978d91d25504a3 Mon Sep 17 00:00:00 2001 From: Ahmad Samir Date: Wed, 14 May 2025 15:05:39 +0300 Subject: [PATCH] tst_QString: don't cast index/length to uint in replace() tests Most of QString's API take by signed values, so let the tests match reality. Also, as pointed out in the code review, use qsizetype instead of int. Pick-to: 6.8 6.5 Change-Id: I03cba8e35d080454506a35a956ad106fd9bb3246 Reviewed-by: Thiago Macieira (cherry picked from commit ef0b8bc7307ac9d7d56a9e7c356df3ecc12a0a87) Reviewed-by: Qt Cherry-pick Bot --- .../auto/corelib/text/qstring/tst_qstring.cpp | 183 +++++++++++++----- 1 file changed, 133 insertions(+), 50 deletions(-) diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index 8390ecd0325..73504b901e2 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -391,8 +391,8 @@ private slots: void replace_qchar_qchar(); void replace_qchar_qstring_data(); void replace_qchar_qstring(); - void replace_uint_uint_data(); - void replace_uint_uint(); + void replace_pos_len_data(); + void replace_pos_len(); void replace_uint_uint_extra(); void replace_extra(); void replace_string_data(); @@ -790,7 +790,7 @@ tst_QString::tst_QString() void tst_QString::remove_uint_uint_data() { - replace_uint_uint_data(); + replace_pos_len_data(); } void tst_QString::remove_string_data() @@ -896,49 +896,132 @@ void tst_QString::replace_qchar_qstring() QCOMPARE(s.replace(before, after, cs), expected); } -void tst_QString::replace_uint_uint_data() +void tst_QString::replace_pos_len_data() { QTest::addColumn("string" ); - QTest::addColumn("index" ); - QTest::addColumn("len" ); + QTest::addColumn("index" ); + QTest::addColumn("len" ); QTest::addColumn("after" ); QTest::addColumn("result" ); - QTest::newRow("empty_rem00") << QString() << 0 << 0 << u""_s << QString(); - QTest::newRow("empty_rem01") << QString() << 0 << 3 << u""_s << QString(); - QTest::newRow("empty_rem02") << QString() << 5 << 3 << u""_s << QString(); + QTest::newRow("empty_rem00") << QString() + << qsizetype(0) << qsizetype(0) << u""_s + << QString(); - QTest::newRow( "rem00" ) << u"-<>ABCABCABCABC>"_s << 0 << 3 << u""_s << u"ABCABCABCABC>"_s; - QTest::newRow( "rem01" ) << u"ABCABCABCABC>"_s << 1 << 4 << u""_s << u"ACABCABC>"_s; - QTest::newRow( "rem04" ) << u"ACABCABC>"_s << 8 << 4 << u""_s << u"ACABCABC"_s; - QTest::newRow( "rem05" ) << u"ACABCABC"_s << 7 << 1 << u""_s << u"ACABCAB"_s; - QTest::newRow( "rem06" ) << u"ACABCAB"_s << 4 << 0 << u""_s << u"ACABCAB"_s; + QTest::newRow("empty_rem01") << QString() + << qsizetype(0) << qsizetype(3) << u""_s + << QString(); - QTest::newRow("empty_rep00") << QString() << 0 << 0 << u"X"_s << u"X"_s; - QTest::newRow("empty_rep01") << QString() << 0 << 3 << u"X"_s << u"X"_s; - QTest::newRow("empty_rep02") << QString() << 5 << 3 << u"X"_s << QString(); + QTest::newRow("empty_rem02") << QString() + << qsizetype(5) << qsizetype(3) << u""_s + << QString(); - QTest::newRow( "rep00" ) << u"ACABCAB"_s << 4 << 0 << u"X"_s << u"ACABXCAB"_s; - QTest::newRow( "rep01" ) << u"ACABXCAB"_s << 4 << 1 << u"Y"_s << u"ACABYCAB"_s; - QTest::newRow( "rep02" ) << u"ACABYCAB"_s << 4 << 1 << u""_s << u"ACABCAB"_s; - QTest::newRow( "rep03" ) << u"ACABCAB"_s << 0 << 9999 << u"XX"_s << u"XX"_s; - QTest::newRow( "rep04" ) << u"XX"_s << 0 << 9999 << u""_s << u""_s; - QTest::newRow( "rep05" ) << u"ACABCAB"_s << 0 << 2 << u"XX"_s << u"XXABCAB"_s; - QTest::newRow( "rep06" ) << u"ACABCAB"_s << 1 << 2 << u"XX"_s << u"AXXBCAB"_s; - QTest::newRow( "rep07" ) << u"ACABCAB"_s << 2 << 2 << u"XX"_s << u"ACXXCAB"_s; - QTest::newRow( "rep08" ) << u"ACABCAB"_s << 3 << 2 << u"XX"_s << u"ACAXXAB"_s; - QTest::newRow( "rep09" ) << u"ACABCAB"_s << 4 << 2 << u"XX"_s << u"ACABXXB"_s; - QTest::newRow( "rep10" ) << u"ACABCAB"_s << 5 << 2 << u"XX"_s << u"ACABCXX"_s; - QTest::newRow( "rep11" ) << u"ACABCAB"_s << 6 << 2 << u"XX"_s << u"ACABCAXX"_s; - QTest::newRow( "rep12" ) << QString() << 0 << 10 << u"X"_s << u"X"_s; - QTest::newRow( "rep13" ) << u"short"_s << 0 << 10 << u"X"_s << u"X"_s; - QTest::newRow( "rep14" ) << QString() << 0 << 10 << u"XX"_s << u"XX"_s; - QTest::newRow( "rep15" ) << u"short"_s << 0 << 10 << u"XX"_s << u"XX"_s; + QTest::newRow("rem00") << u"-<>ABCABCABCABC>"_s + << qsizetype(0) << qsizetype(3) << u""_s + << u"ABCABCABCABC>"_s; + + QTest::newRow("rem01") << u"ABCABCABCABC>"_s + << qsizetype(1) << qsizetype(4) << u""_s + << u"ACABCABC>"_s; + + QTest::newRow("rem04") << u"ACABCABC>"_s << qsizetype(8) << qsizetype(4) + << u""_s + << u"ACABCABC"_s; + + QTest::newRow("rem05") << u"ACABCABC"_s << qsizetype(7) << qsizetype(1) + << u""_s + << u"ACABCAB"_s; + + QTest::newRow("rem06") << u"ACABCAB"_s + << qsizetype(4) << qsizetype(0) << u""_s + << u"ACABCAB"_s; + + QTest::newRow("empty_rep00") << QString() + << qsizetype(0) << qsizetype(0) << u"X"_s + << u"X"_s; + + QTest::newRow("empty_rep01") << QString() + << qsizetype(0) << qsizetype(3) << u"X"_s + << u"X"_s; + + QTest::newRow("empty_rep02") << QString() + << qsizetype(5) << qsizetype(3) << u"X"_s + << QString(); + + QTest::newRow("rep00") << u"ACABCAB"_s + << qsizetype(4) << qsizetype(0) << u"X"_s + << u"ACABXCAB"_s; + + QTest::newRow("rep01") << u"ACABXCAB"_s + << qsizetype(4) << qsizetype(1) << u"Y"_s + << u"ACABYCAB"_s; + + QTest::newRow("rep02") << u"ACABYCAB"_s + << qsizetype(4) << qsizetype(1) << u""_s + << u"ACABCAB"_s; + + QTest::newRow("rep03") << u"ACABCAB"_s + << qsizetype(0) << qsizetype(9999) << u"XX"_s + << u"XX"_s; + + QTest::newRow("rep04") << u"XX"_s + << qsizetype(0) << qsizetype(9999) << u""_s + << u""_s; + + QTest::newRow("rep05") << u"ACABCAB"_s + << qsizetype(0) << qsizetype(2) << u"XX"_s + << u"XXABCAB"_s; + + QTest::newRow("rep06") << u"ACABCAB"_s + << qsizetype(1) << qsizetype(2) << u"XX"_s + << u"AXXBCAB"_s; + + QTest::newRow("rep07") << u"ACABCAB"_s + << qsizetype(2) << qsizetype(2) << u"XX"_s + << u"ACXXCAB"_s; + + QTest::newRow("rep08") << u"ACABCAB"_s + << qsizetype(3) << qsizetype(2) << u"XX"_s + << u"ACAXXAB"_s; + + QTest::newRow("rep09") << u"ACABCAB"_s + << qsizetype(4) << qsizetype(2) << u"XX"_s + << u"ACABXXB"_s; + + QTest::newRow("rep10") << u"ACABCAB"_s + << qsizetype(5) << qsizetype(2) << u"XX"_s + << u"ACABCXX"_s; + + QTest::newRow("rep11") << u"ACABCAB"_s + << qsizetype(6) << qsizetype(2) << u"XX"_s + << u"ACABCAXX"_s; + + QTest::newRow("rep12") << QString() + << qsizetype(0) << qsizetype(10) << u"X"_s + << u"X"_s; + + QTest::newRow("rep13") << u"short"_s + << qsizetype(0) << qsizetype(10) << u"X"_s + << u"X"_s; + + QTest::newRow("rep14") << QString() + << qsizetype(0) << qsizetype(10) << u"XX"_s + << u"XX"_s; + + QTest::newRow("rep15") << u"short"_s + << qsizetype(0) << qsizetype(10) << u"XX"_s + << u"XX"_s; // This is a regression test for an old bug where QString would add index and len parameters, // potentially causing integer overflow. - QTest::newRow( "no overflow" ) << u"ACABCAB"_s << 1 << INT_MAX - 1 << u""_s << u"A"_s; - QTest::newRow( "overflow" ) << u"ACABCAB"_s << 1 << INT_MAX << u""_s << u"A"_s; + constexpr qsizetype maxSize = std::numeric_limits::max(); + QTest::newRow("no overflow") << u"ACABCAB"_s + << qsizetype(1) << maxSize - 1 << u""_s + << u"A"_s; + + QTest::newRow("overflow") << u"ACABCAB"_s + << qsizetype(1) << maxSize << u""_s + << u"A"_s; } void tst_QString::replace_string_data() @@ -4214,42 +4297,42 @@ void tst_QString::prependEventuallyProducesFreeSpaceAtBegin() QCOMPARE_GT(s.data_ptr().freeSpaceAtBegin(), 1); } -void tst_QString::replace_uint_uint() +void tst_QString::replace_pos_len() { QFETCH( QString, string ); - QFETCH( int, index ); - QFETCH( int, len ); + QFETCH( qsizetype, index ); + QFETCH( qsizetype, len ); QFETCH( QString, after ); // Test when the string is shared QString s1 = string; - s1.replace( (uint) index, (int) len, after ); + s1.replace(index, len, after ); QTEST( s1, "result" ); // Test when it's not shared s1 = string; s1.detach(); - s1.replace((uint)index, (int)len, after); + s1.replace(index, len, after); QTEST(s1, "result"); // Test when the string is shared QString s2 = string; - s2.replace((uint)index, (uint)len, after.unicode(), after.size()); + s2.replace(index, len, after.unicode(), after.size()); QTEST(s2, "result"); // Test when it's not shared s2 = string; s2.detach(); - s2.replace((uint)index, (uint)len, after.unicode(), after.size()); + s2.replace(index, len, after.unicode(), after.size()); QTEST(s2, "result"); if (after.size() == 1) { // Test when the string is shared QString s3 = string; - s3.replace((uint)index, (uint)len, QChar(after[0])); + s3.replace(index, len, QChar(after[0])); QTEST(s3, "result"); // Test when it's not shared s3 = string; s3.detach(); - s3.replace((uint)index, (uint)len, QChar(after[0])); + s3.replace(index, len, QChar(after[0])); QTEST(s3, "result"); #if !defined(QT_NO_CAST_FROM_ASCII) @@ -4257,12 +4340,12 @@ void tst_QString::replace_uint_uint() // Test when the string is shared QString s4 = string; - s4.replace((uint)index, (uint)len, QChar(after[0]).toLatin1()); + s4.replace(index, len, QChar(after[0]).toLatin1()); QTEST(s4, "result"); // Test when it's not shared s4 = string; s4.detach(); - s4.replace((uint)index, (uint)len, QChar(after[0]).toLatin1()); + s4.replace(index, len, QChar(after[0]).toLatin1()); QTEST(s4, "result"); #endif } @@ -4493,8 +4576,8 @@ void tst_QString::replace_regexp_extra() void tst_QString::remove_uint_uint() { QFETCH( QString, string ); - QFETCH( int, index ); - QFETCH( int, len ); + QFETCH( qsizetype, index ); + QFETCH( qsizetype, len ); QFETCH( QString, after ); QFETCH(QString, result); @@ -4505,13 +4588,13 @@ void tst_QString::remove_uint_uint() // Test when isShared() is true QString s1 = string; - s1.remove((qsizetype)index, (qsizetype)len); + s1.remove(index, len); QCOMPARE(s1, result); QString s2 = string; // Test when isShared() is false s2.detach(); - s2.remove((qsizetype)index, (qsizetype)len); + s2.remove(index, len); QCOMPARE(s2, result); }