diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2019-05-27 19:13:54 +0200 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2019-07-10 17:05:30 +0200 |
commit | a9aa206b7b8ac4e69f8c46233b4080e00e845ff5 (patch) | |
tree | 0d19cb1f1a3b9d79d322e6e63f6f72160977ca67 /tests/auto/corelib/tools/qstringview | |
parent | 85d3061c1cd4617ef09cb381320611c27da205a5 (diff) |
Move text-related code out of corelib/tools/ to corelib/text/
This includes byte array, string, char, unicode, locale, collation and
regular expressions.
Change-Id: I8b125fa52c8c513eb57a0f1298b91910e5a0d786
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests/auto/corelib/tools/qstringview')
-rw-r--r-- | tests/auto/corelib/tools/qstringview/.gitignore | 1 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qstringview/qstringview.pro | 6 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qstringview/tst_qstringview.cpp | 682 |
3 files changed, 0 insertions, 689 deletions
diff --git a/tests/auto/corelib/tools/qstringview/.gitignore b/tests/auto/corelib/tools/qstringview/.gitignore deleted file mode 100644 index 5f757d448a..0000000000 --- a/tests/auto/corelib/tools/qstringview/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tst_qstringview diff --git a/tests/auto/corelib/tools/qstringview/qstringview.pro b/tests/auto/corelib/tools/qstringview/qstringview.pro deleted file mode 100644 index e0e9973c91..0000000000 --- a/tests/auto/corelib/tools/qstringview/qstringview.pro +++ /dev/null @@ -1,6 +0,0 @@ -CONFIG += testcase -TARGET = tst_qstringview -QT = core testlib -contains(QT_CONFIG, c++14):CONFIG *= c++14 -contains(QT_CONFIG, c++1z):CONFIG *= c++1z -SOURCES += tst_qstringview.cpp diff --git a/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp b/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp deleted file mode 100644 index 794f39708a..0000000000 --- a/tests/auto/corelib/tools/qstringview/tst_qstringview.cpp +++ /dev/null @@ -1,682 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Marc Mutz <marc.mutz@kdab.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtCore module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QStringView> -#include <QString> -#include <QChar> -#include <QStringRef> - -#include <QTest> - -#include <string> - -template <typename T> -using CanConvert = std::is_convertible<T, QStringView>; - -Q_STATIC_ASSERT(!CanConvert<QLatin1String>::value); -Q_STATIC_ASSERT(!CanConvert<const char*>::value); -Q_STATIC_ASSERT(!CanConvert<QByteArray>::value); - -// QStringView qchar_does_not_compile() { return QStringView(QChar('a')); } -// QStringView qlatin1string_does_not_compile() { return QStringView(QLatin1String("a")); } -// QStringView const_char_star_does_not_compile() { return QStringView("a"); } -// QStringView qbytearray_does_not_compile() { return QStringView(QByteArray("a")); } - -// -// QChar -// - -Q_STATIC_ASSERT(!CanConvert<QChar>::value); - -Q_STATIC_ASSERT(CanConvert<QChar[123]>::value); - -Q_STATIC_ASSERT(CanConvert< QString >::value); -Q_STATIC_ASSERT(CanConvert<const QString >::value); -Q_STATIC_ASSERT(CanConvert< QString&>::value); -Q_STATIC_ASSERT(CanConvert<const QString&>::value); - -Q_STATIC_ASSERT(CanConvert< QStringRef >::value); -Q_STATIC_ASSERT(CanConvert<const QStringRef >::value); -Q_STATIC_ASSERT(CanConvert< QStringRef&>::value); -Q_STATIC_ASSERT(CanConvert<const QStringRef&>::value); - - -// -// ushort -// - -Q_STATIC_ASSERT(!CanConvert<ushort>::value); - -Q_STATIC_ASSERT(CanConvert<ushort[123]>::value); - -Q_STATIC_ASSERT(CanConvert< ushort*>::value); -Q_STATIC_ASSERT(CanConvert<const ushort*>::value); - - -// -// char16_t -// - -#if defined(Q_COMPILER_UNICODE_STRINGS) - -Q_STATIC_ASSERT(!CanConvert<char16_t>::value); - -Q_STATIC_ASSERT(CanConvert< char16_t*>::value); -Q_STATIC_ASSERT(CanConvert<const char16_t*>::value); - -#endif - -#if defined(Q_STDLIB_UNICODE_STRINGS) - -Q_STATIC_ASSERT(CanConvert< std::u16string >::value); -Q_STATIC_ASSERT(CanConvert<const std::u16string >::value); -Q_STATIC_ASSERT(CanConvert< std::u16string&>::value); -Q_STATIC_ASSERT(CanConvert<const std::u16string&>::value); - -#endif - - -// -// wchar_t -// - -Q_CONSTEXPR bool CanConvertFromWCharT = -#ifdef Q_OS_WIN - true -#else - false -#endif - ; - -Q_STATIC_ASSERT(!CanConvert<wchar_t>::value); - -Q_STATIC_ASSERT(CanConvert< wchar_t*>::value == CanConvertFromWCharT); -Q_STATIC_ASSERT(CanConvert<const wchar_t*>::value == CanConvertFromWCharT); - -Q_STATIC_ASSERT(CanConvert< std::wstring >::value == CanConvertFromWCharT); -Q_STATIC_ASSERT(CanConvert<const std::wstring >::value == CanConvertFromWCharT); -Q_STATIC_ASSERT(CanConvert< std::wstring&>::value == CanConvertFromWCharT); -Q_STATIC_ASSERT(CanConvert<const std::wstring&>::value == CanConvertFromWCharT); - - -class tst_QStringView : public QObject -{ - Q_OBJECT - -private Q_SLOTS: - void constExpr() const; - void basics() const; - void literals() const; - void at() const; - - void arg() const; - - void fromQString() const; - void fromQStringRef() const; - - void fromQCharStar() const - { - const QChar str[] = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', 0 }; - fromLiteral(str); - } - - void fromUShortStar() const - { - const ushort str[] = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!', 0 }; - fromLiteral(str); - } - - void fromChar16TStar() const - { -#if defined(Q_COMPILER_UNICODE_STRINGS) - fromLiteral(u"Hello, World!"); -#else - QSKIP("This test requires C++11 char16_t support enabled in the compiler"); -#endif - } - - void fromWCharTStar() const - { -#ifdef Q_OS_WIN - fromLiteral(L"Hello, World!"); -#else - QSKIP("This is a Windows-only test"); -#endif - } - - 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 - { -#if defined(Q_COMPILER_UNICODE_STRINGS) - const char16_t str[] = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!' }; - fromRange(std::begin(str), std::end(str)); -#else - QSKIP("This test requires C++11 char16_t support enabled in the compiler"); -#endif - } - - void fromWCharTRange() const - { -#ifdef Q_OS_WIN - const wchar_t str[] = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!' }; - fromRange(std::begin(str), std::end(str)); -#else - QSKIP("This is a Windows-only test"); -#endif - } - - // std::basic_string - void fromStdStringWCharT() const - { -#ifdef Q_OS_WIN - fromStdString<wchar_t>(); -#else - QSKIP("This is a Windows-only test"); -#endif - } - void fromStdStringChar16T() const - { -#ifdef Q_STDLIB_UNICODE_STRINGS - fromStdString<char16_t>(); -#else - QSKIP("This test requires C++11 char16_t support enabled in compiler & stdlib"); -#endif - } - - void comparison(); - -private: - template <typename String> - void conversion_tests(String arg) const; - template <typename Char> - void fromLiteral(const Char *arg) const; - template <typename Char> - void fromRange(const Char *first, const Char *last) const; - template <typename Char, typename Container> - void fromContainer() const; - template <typename Char> - void fromStdString() const { fromContainer<Char, std::basic_string<Char> >(); } -}; - -void tst_QStringView::constExpr() const -{ - // compile-time checks -#ifdef Q_COMPILER_CONSTEXPR - { - constexpr QStringView sv; - Q_STATIC_ASSERT(sv.size() == 0); - Q_STATIC_ASSERT(sv.isNull()); - Q_STATIC_ASSERT(sv.empty()); - Q_STATIC_ASSERT(sv.isEmpty()); - Q_STATIC_ASSERT(sv.utf16() == nullptr); - - constexpr QStringView sv2(sv.utf16(), sv.utf16() + sv.size()); - Q_STATIC_ASSERT(sv2.isNull()); - Q_STATIC_ASSERT(sv2.empty()); - } - { - constexpr QStringView sv = QStringViewLiteral(""); - Q_STATIC_ASSERT(sv.size() == 0); - Q_STATIC_ASSERT(!sv.isNull()); - Q_STATIC_ASSERT(sv.empty()); - Q_STATIC_ASSERT(sv.isEmpty()); - Q_STATIC_ASSERT(sv.utf16() != nullptr); - - constexpr QStringView sv2(sv.utf16(), sv.utf16() + sv.size()); - Q_STATIC_ASSERT(!sv2.isNull()); - Q_STATIC_ASSERT(sv2.empty()); - } - { - constexpr QStringView sv = QStringViewLiteral("Hello"); - Q_STATIC_ASSERT(sv.size() == 5); - Q_STATIC_ASSERT(!sv.empty()); - Q_STATIC_ASSERT(!sv.isEmpty()); - Q_STATIC_ASSERT(!sv.isNull()); - Q_STATIC_ASSERT(*sv.utf16() == 'H'); - Q_STATIC_ASSERT(sv[0] == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.at(0) == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.front() == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.first() == QLatin1Char('H')); - Q_STATIC_ASSERT(sv[4] == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.at(4) == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.back() == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.last() == QLatin1Char('o')); - - constexpr QStringView sv2(sv.utf16(), sv.utf16() + sv.size()); - Q_STATIC_ASSERT(!sv2.isNull()); - Q_STATIC_ASSERT(!sv2.empty()); - Q_STATIC_ASSERT(sv2.size() == 5); - } -#if !defined(Q_OS_WIN) || defined(Q_COMPILER_UNICODE_STRINGS) - { - Q_STATIC_ASSERT(QStringView(u"Hello").size() == 5); - constexpr QStringView sv = u"Hello"; - Q_STATIC_ASSERT(sv.size() == 5); - Q_STATIC_ASSERT(!sv.empty()); - Q_STATIC_ASSERT(!sv.isEmpty()); - Q_STATIC_ASSERT(!sv.isNull()); - Q_STATIC_ASSERT(*sv.utf16() == 'H'); - Q_STATIC_ASSERT(sv[0] == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.at(0) == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.front() == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.first() == QLatin1Char('H')); - Q_STATIC_ASSERT(sv[4] == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.at(4) == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.back() == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.last() == QLatin1Char('o')); - - constexpr QStringView sv2(sv.utf16(), sv.utf16() + sv.size()); - Q_STATIC_ASSERT(!sv2.isNull()); - Q_STATIC_ASSERT(!sv2.empty()); - Q_STATIC_ASSERT(sv2.size() == 5); - - constexpr char16_t *null = nullptr; - constexpr QStringView sv3(null); - Q_STATIC_ASSERT(sv3.isNull()); - Q_STATIC_ASSERT(sv3.isEmpty()); - Q_STATIC_ASSERT(sv3.size() == 0); - } -#else // storage_type is wchar_t - { - Q_STATIC_ASSERT(QStringView(L"Hello").size() == 5); - constexpr QStringView sv = L"Hello"; - Q_STATIC_ASSERT(sv.size() == 5); - Q_STATIC_ASSERT(!sv.empty()); - Q_STATIC_ASSERT(!sv.isEmpty()); - Q_STATIC_ASSERT(!sv.isNull()); - Q_STATIC_ASSERT(*sv.utf16() == 'H'); - Q_STATIC_ASSERT(sv[0] == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.at(0) == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.front() == QLatin1Char('H')); - Q_STATIC_ASSERT(sv.first() == QLatin1Char('H')); - Q_STATIC_ASSERT(sv[4] == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.at(4) == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.back() == QLatin1Char('o')); - Q_STATIC_ASSERT(sv.last() == QLatin1Char('o')); - - constexpr QStringView sv2(sv.utf16(), sv.utf16() + sv.size()); - Q_STATIC_ASSERT(!sv2.isNull()); - Q_STATIC_ASSERT(!sv2.empty()); - Q_STATIC_ASSERT(sv2.size() == 5); - - constexpr wchar_t *null = nullptr; - constexpr QStringView sv3(null); - Q_STATIC_ASSERT(sv3.isNull()); - Q_STATIC_ASSERT(sv3.isEmpty()); - Q_STATIC_ASSERT(sv3.size() == 0); - } -#endif -#endif -} - -void tst_QStringView::basics() const -{ - QStringView sv1; - - // a default-constructed QStringView is null: - QVERIFY(sv1.isNull()); - // which implies it's empty(); - QVERIFY(sv1.isEmpty()); - - QStringView sv2; - - QVERIFY(sv2 == sv1); - QVERIFY(!(sv2 != sv1)); -} - -void tst_QStringView::literals() const -{ -#if !defined(Q_OS_WIN) || defined(Q_COMPILER_UNICODE_STRINGS) - const char16_t hello[] = u"Hello"; - const char16_t longhello[] = - u"Hello World. This is a much longer message, to exercise qustrlen."; - const char16_t withnull[] = u"a\0zzz"; -#else // storage_type is wchar_t - const wchar_t hello[] = L"Hello"; - const wchar_t longhello[] = - L"Hello World. This is a much longer message, to exercise qustrlen."; - const wchar_t withnull[] = L"a\0zzz"; -#endif - Q_STATIC_ASSERT(sizeof(longhello) >= 16); - - QCOMPARE(QStringView(hello).size(), 5); - QCOMPARE(QStringView(hello + 0).size(), 5); // forces decay to pointer - QStringView sv = hello; - QCOMPARE(sv.size(), 5); - QVERIFY(!sv.empty()); - QVERIFY(!sv.isEmpty()); - QVERIFY(!sv.isNull()); - QCOMPARE(*sv.utf16(), 'H'); - QCOMPARE(sv[0], QLatin1Char('H')); - QCOMPARE(sv.at(0), QLatin1Char('H')); - QCOMPARE(sv.front(), QLatin1Char('H')); - QCOMPARE(sv.first(), QLatin1Char('H')); - QCOMPARE(sv[4], QLatin1Char('o')); - QCOMPARE(sv.at(4), QLatin1Char('o')); - QCOMPARE(sv.back(), QLatin1Char('o')); - QCOMPARE(sv.last(), QLatin1Char('o')); - - QStringView sv2(sv.utf16(), sv.utf16() + sv.size()); - QVERIFY(!sv2.isNull()); - QVERIFY(!sv2.empty()); - QCOMPARE(sv2.size(), 5); - - QStringView sv3(longhello); - QCOMPARE(size_t(sv3.size()), sizeof(longhello)/sizeof(longhello[0]) - 1); - QCOMPARE(sv3.last(), QLatin1Char('.')); - sv3 = longhello; - QCOMPARE(size_t(sv3.size()), sizeof(longhello)/sizeof(longhello[0]) - 1); - - for (int i = 0; i < sv3.size(); ++i) { - QStringView sv4(longhello + i); - QCOMPARE(size_t(sv4.size()), sizeof(longhello)/sizeof(longhello[0]) - 1 - i); - QCOMPARE(sv4.last(), QLatin1Char('.')); - sv4 = longhello + i; - QCOMPARE(size_t(sv4.size()), sizeof(longhello)/sizeof(longhello[0]) - 1 - i); - } - - // these are different results - QCOMPARE(size_t(QStringView(withnull).size()), sizeof(withnull)/sizeof(withnull[0]) - 1); - QCOMPARE(QStringView(withnull + 0).size(), 1); -} - -void tst_QStringView::at() const -{ - QString hello("Hello"); - QStringView sv(hello); - QCOMPARE(sv.at(0), QChar('H')); QCOMPARE(sv[0], QChar('H')); - QCOMPARE(sv.at(1), QChar('e')); QCOMPARE(sv[1], QChar('e')); - QCOMPARE(sv.at(2), QChar('l')); QCOMPARE(sv[2], QChar('l')); - QCOMPARE(sv.at(3), QChar('l')); QCOMPARE(sv[3], QChar('l')); - QCOMPARE(sv.at(4), QChar('o')); QCOMPARE(sv[4], QChar('o')); -} - -void tst_QStringView::arg() const -{ -#define CHECK1(pattern, arg1, expected) \ - do { \ - auto p = QStringViewLiteral(pattern); \ - QCOMPARE(p.arg(QLatin1String(arg1)), expected); \ - QCOMPARE(p.arg(QStringViewLiteral(arg1)), expected); \ - QCOMPARE(p.arg(QStringLiteral(arg1)), expected); \ - QCOMPARE(p.arg(QString(QLatin1String(arg1))), expected); \ - } while (false) \ - /*end*/ -#define CHECK2(pattern, arg1, arg2, expected) \ - do { \ - auto p = QStringViewLiteral(pattern); \ - QCOMPARE(p.arg(QLatin1String(arg1), QLatin1String(arg2)), expected); \ - QCOMPARE(p.arg(QStringViewLiteral(arg1), QLatin1String(arg2)), expected); \ - QCOMPARE(p.arg(QLatin1String(arg1), QStringViewLiteral(arg2)), expected); \ - QCOMPARE(p.arg(QStringViewLiteral(arg1), QStringViewLiteral(arg2)), expected); \ - } while (false) \ - /*end*/ - - CHECK1("", "World", ""); - CHECK1("%1", "World", "World"); - CHECK1("!%1?", "World", "!World?"); - CHECK1("%1%1", "World", "WorldWorld"); - CHECK1("%1%2", "World", "World%2"); - CHECK1("%2%1", "World", "%2World"); - - CHECK2("", "Hello", "World", ""); - CHECK2("%1", "Hello", "World", "Hello"); - CHECK2("!%1, %2?", "Hello", "World", "!Hello, World?"); - CHECK2("%1%1", "Hello", "World", "HelloHello"); - CHECK2("%1%2", "Hello", "World", "HelloWorld"); - CHECK2("%2%1", "Hello", "World", "WorldHello"); - -#undef CHECK2 -#undef CHECK1 - - QCOMPARE(QStringViewLiteral(" %2 %2 %1 %3 ").arg(QLatin1Char('c'), QChar::CarriageReturn, u'C'), " \r \r c C "); -} - -void tst_QStringView::fromQString() const -{ - QString null; - QString empty = ""; - - QVERIFY( QStringView(null).isNull()); - QVERIFY( QStringView(null).isEmpty()); - QVERIFY( QStringView(empty).isEmpty()); - QVERIFY(!QStringView(empty).isNull()); - - conversion_tests(QString("Hello World!")); -} - -void tst_QStringView::fromQStringRef() const -{ - QStringRef null; - QString emptyS = ""; - QStringRef empty(&emptyS); - - QVERIFY( QStringView(null).isNull()); - QVERIFY( QStringView(null).isEmpty()); - QVERIFY( QStringView(empty).isEmpty()); - QVERIFY(!QStringView(empty).isNull()); - - conversion_tests(QString("Hello World!").midRef(6)); -} - -template <typename Char> -void tst_QStringView::fromLiteral(const Char *arg) const -{ - const Char *null = nullptr; - const Char empty[] = { 0 }; - - QCOMPARE(QStringView(null).size(), qsizetype(0)); - QCOMPARE(QStringView(null).data(), nullptr); - QCOMPARE(QStringView(empty).size(), qsizetype(0)); - QCOMPARE(static_cast<const void*>(QStringView(empty).data()), - static_cast<const void*>(empty)); - - QVERIFY( QStringView(null).isNull()); - QVERIFY( QStringView(null).isEmpty()); - QVERIFY( QStringView(empty).isEmpty()); - QVERIFY(!QStringView(empty).isNull()); - - conversion_tests(arg); -} - -template <typename Char> -void tst_QStringView::fromRange(const Char *first, const Char *last) const -{ - const Char *null = nullptr; - QCOMPARE(QStringView(null, null).size(), 0); - QCOMPARE(QStringView(null, null).data(), nullptr); - QCOMPARE(QStringView(first, first).size(), 0); - QCOMPARE(static_cast<const void*>(QStringView(first, first).data()), - static_cast<const void*>(first)); - - const auto sv = QStringView(first, last); - QCOMPARE(sv.size(), last - first); - QCOMPARE(static_cast<const void*>(sv.data()), - static_cast<const void*>(first)); - - // can't call conversion_tests() here, as it requires a single object -} - -template <typename Char, typename Container> -void tst_QStringView::fromContainer() const -{ - const QString s = "Hello World!"; - - Container c; - // unspecified whether empty containers make null QStringViews - QVERIFY(QStringView(c).isEmpty()); - - QCOMPARE(sizeof(Char), sizeof(QChar)); - - const auto *data = reinterpret_cast<const Char *>(s.utf16()); - std::copy(data, data + s.size(), std::back_inserter(c)); - conversion_tests(std::move(c)); -} - -namespace help { -template <typename T> -size_t size(const T &t) { return size_t(t.size()); } -template <typename T> -size_t size(const T *t) -{ - size_t result = 0; - if (t) { - while (*t++) - ++result; - } - return result; -} -size_t size(const QChar *t) -{ - size_t result = 0; - if (t) { - while (!t++->isNull()) - ++result; - } - return result; -} - -template <typename T> -typename T::const_iterator cbegin(const T &t) { return t.cbegin(); } -template <typename T> -const T * cbegin(const T *t) { return t; } - -template <typename T> -typename T::const_iterator cend(const T &t) { return t.cend(); } -template <typename T> -const T * cend(const T *t) { return t + size(t); } - -template <typename T> -typename T::const_reverse_iterator crbegin(const T &t) { return t.crbegin(); } -template <typename T> -std::reverse_iterator<const T*> crbegin(const T *t) { return std::reverse_iterator<const T*>(cend(t)); } - -template <typename T> -typename T::const_reverse_iterator crend(const T &t) { return t.crend(); } -template <typename T> -std::reverse_iterator<const T*> crend(const T *t) { return std::reverse_iterator<const T*>(cbegin(t)); } - -} // namespace help - -template <typename String> -void tst_QStringView::conversion_tests(String string) const -{ - // copy-construct: - { - QStringView sv = string; - - QCOMPARE(help::size(sv), help::size(string)); - - // check iterators: - - QVERIFY(std::equal(help::cbegin(string), help::cend(string), - QT_MAKE_CHECKED_ARRAY_ITERATOR(sv.cbegin(), sv.size()))); - QVERIFY(std::equal(help::cbegin(string), help::cend(string), - QT_MAKE_CHECKED_ARRAY_ITERATOR(sv.begin(), sv.size()))); - QVERIFY(std::equal(help::crbegin(string), help::crend(string), - sv.crbegin())); - QVERIFY(std::equal(help::crbegin(string), help::crend(string), - sv.rbegin())); - - QCOMPARE(sv, string); - } - - QStringView sv; - - // copy-assign: - { - sv = string; - - QCOMPARE(help::size(sv), help::size(string)); - - // check relational operators: - - QCOMPARE(sv, string); - QCOMPARE(string, sv); - - QVERIFY(!(sv != string)); - QVERIFY(!(string != sv)); - - QVERIFY(!(sv < string)); - QVERIFY(sv <= string); - QVERIFY(!(sv > string)); - QVERIFY(sv >= string); - - QVERIFY(!(string < sv)); - QVERIFY(string <= sv); - QVERIFY(!(string > sv)); - QVERIFY(string >= sv); - } - - // copy-construct from rvalue (QStringView never assumes ownership): - { - QStringView sv2 = std::move(string); - QCOMPARE(sv2, sv); - QCOMPARE(sv2, string); - } - - // copy-assign from rvalue (QStringView never assumes ownership): - { - QStringView sv2; - sv2 = std::move(string); - QCOMPARE(sv2, sv); - QCOMPARE(sv2, string); - } -} - -void tst_QStringView::comparison() -{ - const QStringView aa = QStringViewLiteral("aa"); - const QStringView upperAa = QStringViewLiteral("AA"); - const QStringView bb = QStringViewLiteral("bb"); - - QVERIFY(aa == aa); - QVERIFY(aa != bb); - QVERIFY(aa < bb); - QVERIFY(bb > aa); - - QCOMPARE(aa.compare(aa), 0); - QVERIFY(aa.compare(upperAa) != 0); - QCOMPARE(aa.compare(upperAa, Qt::CaseInsensitive), 0); - QVERIFY(aa.compare(bb) < 0); - QVERIFY(bb.compare(aa) > 0); -} - -QTEST_APPLESS_MAIN(tst_QStringView) -#include "tst_qstringview.moc" |