add autotest for ProString

also adds documentation, which is kind of a sanity test. ehm.

Change-Id: I6b520e8b505a2bfbb1e376fa72be0f140227a3a4
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
This commit is contained in:
Oswald Buddenhagen 2015-03-06 21:14:17 +01:00
parent a3fac53864
commit f37381e292
2 changed files with 93 additions and 0 deletions

View File

@ -159,6 +159,18 @@ QString &ProString::toQString(QString &tmp) const
return tmp.setRawData(m_string.constData() + m_offset, m_length); return tmp.setRawData(m_string.constData() + m_offset, m_length);
} }
/*!
* \brief ProString::prepareExtend
* \param extraLen number of new characters to be added
* \param thisTarget offset to which current contents should be moved
* \param extraTarget offset at which new characters will be added
* \return pointer to storage location for new characters
*
* Prepares the string for adding new characters.
* If the string is detached and has enough space, it will be changed in place.
* Otherwise, it will be replaced with a new string object, thus detaching.
* In either case, the hash will be reset.
*/
QChar *ProString::prepareExtend(int extraLen, int thisTarget, int extraTarget) QChar *ProString::prepareExtend(int extraLen, int thisTarget, int extraTarget)
{ {
if (m_string.isDetached() && m_length + extraLen <= m_string.capacity()) { if (m_string.isDetached() && m_length + extraLen <= m_string.capacity()) {

View File

@ -57,12 +57,93 @@ private slots:
void quoteArgWin(); void quoteArgWin();
void pathUtils(); void pathUtils();
void proString();
void proStringList(); void proStringList();
void proParser_data(); void proParser_data();
void proParser(); void proParser();
}; };
void tst_qmakelib::proString()
{
QString qs1(QStringLiteral("this is a string"));
ProString s1(qs1);
QCOMPARE(s1.toQString(), QStringLiteral("this is a string"));
ProString s2(qs1, 5, 8);
QCOMPARE(s2.toQString(), QStringLiteral("is a str"));
QCOMPARE(s2.hash(), 0x80000000);
qHash(s2);
QCOMPARE(s2.hash(), 90404018U);
QCOMPARE(s2.mid(0, 10).toQString(), QStringLiteral("is a str"));
QCOMPARE(s2.mid(1, 5).toQString(), QStringLiteral("s a s"));
QCOMPARE(s2.mid(10, 3).toQString(), QStringLiteral(""));
QString qs2(QStringLiteral(" spacy string "));
QCOMPARE(ProString(qs2, 3, 13).trimmed().toQString(), QStringLiteral("spacy string"));
QCOMPARE(ProString(qs2, 1, 17).trimmed().toQString(), QStringLiteral("spacy string"));
QVERIFY(s2.toQStringRef().string()->isSharedWith(qs1));
s2.prepend(ProString("there "));
QCOMPARE(s2.toQString(), QStringLiteral("there is a str"));
QVERIFY(!s2.toQStringRef().string()->isSharedWith(qs1));
ProString s3("this is a longish string with bells and whistles");
s3 = s3.mid(18, 17);
// Prepend to detached string with lots of spare space in it.
s3.prepend(ProString("another "));
QCOMPARE(s3.toQString(), QStringLiteral("another string with bells"));
// Note: The string still has plenty of spare space.
s3.append(QLatin1Char('.'));
QCOMPARE(s3.toQString(), QStringLiteral("another string with bells."));
s3.append(QLatin1String(" eh?"));
QCOMPARE(s3.toQString(), QStringLiteral("another string with bells. eh?"));
s3.append(ProString(" yeah!"));
QCOMPARE(s3.toQString(), QStringLiteral("another string with bells. eh? yeah!"));
bool pending = false; // Not in string, but joining => add space
s3.append(ProString("..."), &pending);
QCOMPARE(s3.toQString(), QStringLiteral("another string with bells. eh? yeah! ..."));
QVERIFY(pending);
ProStringList sl1;
sl1 << ProString("") << ProString("foo") << ProString("barbaz");
ProString s4a("hallo");
s4a.append(sl1);
QCOMPARE(s4a.toQString(), QStringLiteral("hallo foo barbaz"));
ProString s4b("hallo");
pending = false;
s4b.append(sl1, &pending);
QCOMPARE(s4b.toQString(), QStringLiteral("hallo foo barbaz"));
ProString s4c;
pending = false;
s4c.append(sl1, &pending);
QCOMPARE(s4c.toQString(), QStringLiteral(" foo barbaz"));
// bizarreness
ProString s4d("hallo");
pending = false;
s4d.append(sl1, &pending, true);
QCOMPARE(s4d.toQString(), QStringLiteral("hallo foo barbaz"));
ProString s4e;
pending = false;
s4e.append(sl1, &pending, true);
QCOMPARE(s4e.toQString(), QStringLiteral("foo barbaz"));
ProStringList sl2;
sl2 << ProString("foo");
ProString s5;
s5.append(sl2);
QCOMPARE(s5.toQString(), QStringLiteral("foo"));
QVERIFY(s5.toQStringRef().string()->isSharedWith(*sl2.first().toQStringRef().string()));
QCOMPARE(ProString("one") + ProString(" more"), QStringLiteral("one more"));
}
void tst_qmakelib::proStringList() void tst_qmakelib::proStringList()
{ {
ProStringList sl1; ProStringList sl1;