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.9 6.8 6.5
Change-Id: I03cba8e35d080454506a35a956ad106fd9bb3246
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Ahmad Samir 2025-05-14 15:05:39 +03:00
parent 3252e1808c
commit ef0b8bc730

View File

@ -392,8 +392,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();
@ -791,7 +791,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()
@ -897,49 +897,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<QString>("string" );
QTest::addColumn<int>("index" );
QTest::addColumn<int>("len" );
QTest::addColumn<qsizetype>("index" );
QTest::addColumn<qsizetype>("len" );
QTest::addColumn<QString>("after" );
QTest::addColumn<QString>("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<qsizetype>::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()
@ -4215,42 +4298,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)
@ -4258,12 +4341,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
}
@ -4494,8 +4577,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);
@ -4506,13 +4589,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);
}