From fe53fce15fc5a2ffcca4917eb3309d64b77743df Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Sat, 6 May 2023 10:04:49 -0700 Subject: [PATCH] tst_QAnyStringView: test some longer strings and some containing nulls Change-Id: Ieab617d69f3b4b54ab30fffd175c9cbb4f5d19b9 Reviewed-by: Marc Mutz Reviewed-by: Samuel Gaist Reviewed-by: Sze Howe Koh Reviewed-by: BogDan Vatra --- .../qanystringview/tst_qanystringview.cpp | 137 +++++++++++++----- 1 file changed, 102 insertions(+), 35 deletions(-) diff --git a/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp b/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp index fa55bf5db2..52d1042769 100644 --- a/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp +++ b/tests/auto/corelib/text/qanystringview/tst_qanystringview.cpp @@ -252,6 +252,50 @@ static_assert(CanConvert); #endif // QT_CONFIG(cpp_winrt) +template struct SampleStrings +{ + static constexpr char emptyString[] = ""; + static constexpr char regularString[] = "Hello World!"; + static constexpr char regularLongString[] = R"(Lorem ipsum dolor sit amet, consectetur +adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna +aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi +ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in +voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint +occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim +id est laborum.)"; + static constexpr char stringWithNulls[] = "Hello\0World\0!"; + static constexpr qsizetype stringWithNullsLength = std::size(stringWithNulls) -1; +}; + +template <> struct SampleStrings +{ + static constexpr char16_t emptyString[] = u""; + static constexpr char16_t regularString[] = u"Hello World!"; + static constexpr char16_t regularLongString[] = uR"(Lorem ipsum dolor sit amet, consectetur +adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna +aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi +ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in +voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint +occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim +id est laborum.)"; + static constexpr char16_t stringWithNulls[] = u"Hello\0World\0!"; + static constexpr qsizetype stringWithNullsLength = std::size(stringWithNulls) -1; +}; + +template <> struct SampleStrings +{ + static constexpr QChar emptyString[] = { {} }; // this one is easy + static const QChar *const regularString; + static const QChar *const regularLongString; + static const QChar *const stringWithNulls; + static constexpr qsizetype stringWithNullsLength = SampleStrings::stringWithNullsLength; +}; +const QChar *const SampleStrings::regularString = + reinterpret_cast(SampleStrings::regularString); +const QChar *const SampleStrings::regularLongString = + reinterpret_cast(SampleStrings::regularLongString); +const QChar *const SampleStrings::stringWithNulls = + reinterpret_cast(SampleStrings::stringWithNulls); class tst_QAnyStringView : public QObject { @@ -264,6 +308,8 @@ private Q_SLOTS: void fromQString() const { fromQStringOrByteArray(); } void fromQByteArray() const { fromQStringOrByteArray(); } + void fromQStringView() const { fromQStringOrByteArray(); } + void fromQUtf8StringView() const { fromQStringOrByteArray(); } void fromCharArray() const { fromArray(); } void fromChar8Array() const { ONLY_IF_CHAR_8_T(fromArray()); } @@ -291,29 +337,12 @@ private Q_SLOTS: void fromChar16TStar() const { fromLiteral(u"Hello, World!"); } void fromWCharTStar() const { ONLY_WIN(fromLiteral(L"Hello, World!")); } - void fromQCharRange() const - { - const QChar str[] = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!' }; - fromRange(std::begin(str), std::end(str)); - } - - void fromUShortRange() const - { - const ushort str[] = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!' }; - fromRange(std::begin(str), std::end(str)); - } - - void fromChar16TRange() const - { - const char16_t str[] = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!' }; - fromRange(std::begin(str), std::end(str)); - } - - void fromWCharTRange() const - { - [[maybe_unused]] const wchar_t str[] = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!' }; - ONLY_WIN(fromRange(std::begin(str), std::end(str))); - } + void fromCharRange() const { fromRange(); } + void fromChar8TRange() const { ONLY_IF_CHAR_8_T(fromRange()); } + void fromQCharRange() const { fromRange(); } + void fromUShortRange() const { fromRange(); } + void fromChar16TRange() const { fromRange(); } + void fromWCharTRange() const { ONLY_WIN(fromRange()); } // std::basic_string void fromStdStringChar() const { fromStdString(); } @@ -341,7 +370,7 @@ private: template void fromLiteral(const Char *arg) const; template - void fromRange(const Char *first, const Char *last) const; + void fromRange() const; template void fromContainer() const; template @@ -499,18 +528,28 @@ void tst_QAnyStringView::fromArray() const QCOMPARE(sv2.back(), u'c'); } + template void tst_QAnyStringView::fromQStringOrByteArray() const { + using Char = std::remove_cv_t; + using Strings = SampleStrings; + QStringOrByteArray null; - QStringOrByteArray empty = ""; + QStringOrByteArray empty(Strings::emptyString); QVERIFY( QAnyStringView(null).isNull()); QVERIFY( QAnyStringView(null).isEmpty()); QVERIFY( QAnyStringView(empty).isEmpty()); QVERIFY(!QAnyStringView(empty).isNull()); - conversion_tests(QStringOrByteArray("Hello World!")); + conversion_tests(QStringOrByteArray(Strings::regularString)); + if (QTest::currentTestFailed()) + return; + conversion_tests(QStringOrByteArray(Strings::regularLongString)); + if (QTest::currentTestFailed()) + return; + conversion_tests(QStringOrByteArray(Strings::stringWithNulls, Strings::stringWithNullsLength)); } template @@ -534,27 +573,48 @@ void tst_QAnyStringView::fromLiteral(const Char *arg) const } template -void tst_QAnyStringView::fromRange(const Char *first, const Char *last) const +void tst_QAnyStringView::fromRange() const { + auto doTest = [](const Char *first, const Char *last) { + QCOMPARE(QAnyStringView(first, first).size(), 0); + QCOMPARE(static_cast(QAnyStringView(first, first).data()), + static_cast(first)); + + const auto sv = QAnyStringView(first, last); + QCOMPARE(sv.size(), last - first); + QCOMPARE(static_cast(sv.data()), + static_cast(first)); + + // can't call conversion_tests() here, as it requires a single object + }; const Char *null = nullptr; + using RealChar = std::conditional_t; + using Strings = SampleStrings; + QCOMPARE(QAnyStringView(null, null).size(), 0); QCOMPARE(QAnyStringView(null, null).data(), nullptr); - QCOMPARE(QAnyStringView(first, first).size(), 0); - QCOMPARE(static_cast(QAnyStringView(first, first).data()), - static_cast(first)); - const auto sv = QAnyStringView(first, last); - QCOMPARE(sv.size(), last - first); - QCOMPARE(static_cast(sv.data()), - static_cast(first)); + doTest(reinterpret_cast(std::begin(Strings::regularString)), + reinterpret_cast(std::end(Strings::regularString))); + if (QTest::currentTestFailed()) + return; - // can't call conversion_tests() here, as it requires a single object + doTest(reinterpret_cast(std::begin(Strings::regularLongString)), + reinterpret_cast(std::end(Strings::regularLongString))); + if (QTest::currentTestFailed()) + return; + + doTest(reinterpret_cast(std::begin(Strings::stringWithNulls)), + reinterpret_cast(std::end(Strings::stringWithNulls))); + if (QTest::currentTestFailed()) + return; } template void tst_QAnyStringView::fromContainer() const { const std::string s = "Hello World!"; + const std::string n(SampleStrings::stringWithNulls, SampleStrings::stringWithNullsLength); Container c; // unspecified whether empty containers make null QAnyStringViews @@ -562,6 +622,13 @@ void tst_QAnyStringView::fromContainer() const std::copy(s.begin(), s.end(), std::back_inserter(c)); conversion_tests(std::move(c)); + if (QTest::currentTestFailed()) + return; + + // repeat with nulls + c = {}; + std::copy(n.begin(), n.end(), std::back_inserter(c)); + conversion_tests(std::move(c)); } template