diff options
author | Marc Mutz <marc.mutz@qt.io> | 2023-06-02 16:22:37 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2023-06-07 23:18:03 +0000 |
commit | f5ed163c19c4a165a61e6fbfdaf5ee39b5587a0c (patch) | |
tree | a8ab795999c4e6ec4bdc91ca26167564f6433cb6 /tests/auto/corelib/text/qstring/tst_qstring.cpp | |
parent | 245c2b621f5942861b7f827bfc8a859b9efb9b72 (diff) |
QString: add STL-style assign() [2/4]: (it,it) overload for QChar-convertible *it
Restrict the permissible value_types to those QStringView can take,
plus QLatin1Char. All of these implicitly convert to QChar and give
the correct result, even when converted char-by-char.
Task-number: QTBUG-106198
Pick-to: 6.6
Change-Id: Icb44244cb08af391161c4309467d4e0d2d3d3d62
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Dennis Oberst <dennis.oberst@qt.io>
Diffstat (limited to 'tests/auto/corelib/text/qstring/tst_qstring.cpp')
-rw-r--r-- | tests/auto/corelib/text/qstring/tst_qstring.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index a6362d6a23..f3d2594e34 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -27,9 +27,11 @@ #include <qhash.h> #include <private/qtools_p.h> +#include <forward_list> #include <string> #include <algorithm> #include <limits> +#include <sstream> #include "../shared/test_number_shared.h" #include "../../../../shared/localechange.h" @@ -3424,11 +3426,52 @@ void tst_QString::assign() QCOMPARE(str.assign(3, u'x'), u"xxx"); QCOMPARE(str.size(), 3); } + // QString &assign(InputIterator, InputIterator) + { + // Forward iterator versions + QString str; + const QString tstr = QString::fromUtf8(u8"(ノಠ益ಠ)\0ノ彡┻━┻"); + QCOMPARE(str.assign(tstr.begin(), tstr.end()), u"(ノಠ益ಠ)\0ノ彡┻━┻"); + QCOMPARE(str.size(), 6); + + const char16_t c16[] = u"٩(⁎❛ᴗ❛⁎)۶ 🤷"; + str.assign(std::begin(c16), std::end(c16) - 1); + QCOMPARE(str, c16); + + std::u16string c16str(c16); + str.assign(c16str.begin(), c16str.end()); + QCOMPARE(str, c16); + + QVarLengthArray<QLatin1Char, 5> l1ch = {'F'_L1, 'G'_L1, 'H'_L1, 'I'_L1, 'J'_L1}; + str.assign(l1ch.begin(), l1ch.end()); + QCOMPARE(str, u"FGHIJ"); + std::forward_list<QChar> qch = {u'G', u'H', u'I', u'J', u'K'}; + str.assign(qch.begin(), qch.end()); + QCOMPARE(str, u"GHIJK"); + const QList<char16_t> qch16 = {u'X', u'H', u'I', u'J', u'K'}; // QList<T>::iterator need not be T* + str.assign(qch16.begin(), qch16.end()); + QCOMPARE(str, u"XHIJK"); +#if defined(Q_OS_WIN) + QVarLengthArray<wchar_t> wch = {L'A', L'B', L'C', L'D', L'E'}; + str.assign(wch.begin(), wch.end()); + QCOMPARE(str, u"ABCDE"); +#endif + // Input iterator versions + std::stringstream ss("50 51 52 53 54"); + str.assign(std::istream_iterator<ushort>{ss}, std::istream_iterator<ushort>{}); + QCOMPARE(str, u"23456"); + } // Test chaining { QString str; + QString tstr = u"TEST DATA"_s; + str.assign(tstr.begin(), tstr.end()).assign({"Hello World!"}).assign(5, u'T'); + QCOMPARE(str, u"TTTTT"); + QCOMPARE(str.size(), 5); QCOMPARE(str.assign(300, u'T').assign({"[̲̅$̲̅(̲̅5̲̅)̲̅$̲̅]"}), u"[̲̅$̲̅(̲̅5̲̅)̲̅$̲̅]"); QCOMPARE(str.size(), 19); + QCOMPARE(str.assign(10, u'c').assign(str.begin(), str.end()), str); + QCOMPARE(str.size(), 10); QCOMPARE(str.assign("data").assign(QByteArrayView::fromArray( {std::byte('T'), std::byte('T'), std::byte('T')})), u"TTT"); QCOMPARE(str.size(), 3); @@ -3456,6 +3499,43 @@ void tst_QString::assign_shared() QCOMPARE(str, u"DDDD"); QCOMPARE(strCopy, u"DATA"); } + { + QString str = "DATA"_L1; + QVERIFY(str.isDetached()); + auto copyForwardIt = str; + QVERIFY(!str.isDetached()); + QVERIFY(!copyForwardIt.isDetached()); + QVERIFY(str.isSharedWith(copyForwardIt)); + QVERIFY(copyForwardIt.isSharedWith(str)); + + QString tstr = u"DDDD"_s; + str.assign(tstr.begin(), tstr.end()); + QVERIFY(str.isDetached()); + QVERIFY(copyForwardIt.isDetached()); + QVERIFY(!str.isSharedWith(copyForwardIt)); + QVERIFY(!copyForwardIt.isSharedWith(str)); + QCOMPARE(str, u"DDDD"); + QCOMPARE(copyForwardIt, u"DATA"); + } + { + QString str = "DATA"_L1; + QVERIFY(str.isDetached()); + auto copyInputIt = str; + QVERIFY(!str.isDetached()); + QVERIFY(!copyInputIt.isDetached()); + QVERIFY(str.isSharedWith(copyInputIt)); + QVERIFY(copyInputIt.isSharedWith(str)); + + std::stringstream ss("49 50 51 52 53 54 "); + str.assign(std::istream_iterator<ushort>{ss}, std::istream_iterator<ushort>{}); + QVERIFY(str.isDetached()); + QVERIFY(copyInputIt.isDetached()); + QVERIFY(!str.isSharedWith(copyInputIt)); + QVERIFY(!copyInputIt.isSharedWith(str)); + + QCOMPARE(str, u"123456"); + QCOMPARE(copyInputIt, u"DATA"); + } } void tst_QString::assign_uses_prepend_buffer() @@ -3484,6 +3564,25 @@ void tst_QString::assign_uses_prepend_buffer() QCOMPARE_EQ(capEnd(withFreeSpaceAtBegin), oldCapEnd); QCOMPARE(withFreeSpaceAtBegin, test); } + // QString &assign(InputIterator, InputIterator) + { + QString withFreeSpaceAtBegin; + for (int i = 0; i < 100 && withFreeSpaceAtBegin.d.freeSpaceAtBegin() < 2; ++i) + withFreeSpaceAtBegin.prepend(u'd'); + QCOMPARE_GT(withFreeSpaceAtBegin.d.freeSpaceAtBegin(), 1); + + const auto oldCapBegin = capBegin(withFreeSpaceAtBegin); + const auto oldCapEnd = capEnd(withFreeSpaceAtBegin); + + std::stringstream ss; + for (qsizetype i = 0; i < withFreeSpaceAtBegin.d.freeSpaceAtBegin(); ++i) + ss << "d "; + + withFreeSpaceAtBegin.assign(std::istream_iterator<ushort>{ss}, std::istream_iterator<ushort>{}); + QCOMPARE_EQ(withFreeSpaceAtBegin.d.freeSpaceAtBegin(), 0); // we used the prepend buffer + QCOMPARE_EQ(capBegin(withFreeSpaceAtBegin), oldCapBegin); + QCOMPARE_EQ(capEnd(withFreeSpaceAtBegin), oldCapEnd); + } } void tst_QString::operator_pluseq_special_cases() |