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 <thiago.macieira@intel.com> (cherry picked from commit ef0b8bc7307ac9d7d56a9e7c356df3ecc12a0a87) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
c4f2d63799
commit
c2edbc1a77
@ -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<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()
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user