diff --git a/qmake/library/proitems.cpp b/qmake/library/proitems.cpp index e780259417..f3526846e9 100644 --- a/qmake/library/proitems.cpp +++ b/qmake/library/proitems.cpp @@ -159,6 +159,18 @@ QString &ProString::toQString(QString &tmp) const 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) { if (m_string.isDetached() && m_length + extraLen <= m_string.capacity()) { diff --git a/tests/auto/tools/qmakelib/tst_qmakelib.cpp b/tests/auto/tools/qmakelib/tst_qmakelib.cpp index 441a36e34d..ab14de0e24 100644 --- a/tests/auto/tools/qmakelib/tst_qmakelib.cpp +++ b/tests/auto/tools/qmakelib/tst_qmakelib.cpp @@ -57,12 +57,93 @@ private slots: void quoteArgWin(); void pathUtils(); + void proString(); void proStringList(); void proParser_data(); 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() { ProStringList sl1;