Extend tests for QUtf8StringView
The existing tests were taken from tst_QLatin1StringView. This patch adds the simple tests from tst_QStringView. The tests fromLiteral(), fromRange() and fromContainer() are not included in this patch. Pick-to: 6.9 6.8 6.5 Task-number: QTBUG-132097 Change-Id: I1efc0c2d2f474f6644261575a745aa8f7e5ac4b2 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit 26bf2bedca96c2362e7b29f08e9ca978d9496883) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
6588b46c82
commit
c9d597f5db
@ -14,6 +14,8 @@ endif()
|
|||||||
qt_internal_add_test(tst_qutf8stringview
|
qt_internal_add_test(tst_qutf8stringview
|
||||||
SOURCES
|
SOURCES
|
||||||
tst_qutf8stringview.cpp
|
tst_qutf8stringview.cpp
|
||||||
|
LIBRARIES
|
||||||
|
Qt::TestPrivate
|
||||||
)
|
)
|
||||||
|
|
||||||
## Scopes:
|
## Scopes:
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
#include <QtTest/QTest>
|
#include <QtTest/QTest>
|
||||||
#include <QtCore/QString>
|
#include <QtCore/QString>
|
||||||
|
|
||||||
|
#include <private/qcomparisontesthelper_p.h>
|
||||||
|
|
||||||
#ifdef __cpp_char8_t
|
#ifdef __cpp_char8_t
|
||||||
# define ONLY_IF_CHAR_8_T(expr) expr
|
# define ONLY_IF_CHAR_8_T(expr) expr
|
||||||
#else
|
#else
|
||||||
@ -43,9 +45,16 @@ class tst_QUtf8StringView : public QObject
|
|||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void fromArraysOfUnknownSize();
|
void fromArraysOfUnknownSize();
|
||||||
void constExpr();
|
void constExpr();
|
||||||
|
void basics();
|
||||||
|
void literalsChar8();
|
||||||
|
void literalsChar();
|
||||||
void construction();
|
void construction();
|
||||||
void at();
|
void at();
|
||||||
void arg() const;
|
void arg() const;
|
||||||
|
void fromQString();
|
||||||
|
void comparison();
|
||||||
|
void std_stringview_conversion();
|
||||||
|
void overloadResolution();
|
||||||
void midLeftRight();
|
void midLeftRight();
|
||||||
void nullString();
|
void nullString();
|
||||||
void emptyString();
|
void emptyString();
|
||||||
@ -126,6 +135,115 @@ void tst_QUtf8StringView::constExpr()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QUtf8StringView::basics()
|
||||||
|
{
|
||||||
|
QUtf8StringView sv1;
|
||||||
|
|
||||||
|
// a default-constructed QStringView is null:
|
||||||
|
QVERIFY(sv1.isNull());
|
||||||
|
// which implies it's empty();
|
||||||
|
QVERIFY(sv1.isEmpty());
|
||||||
|
|
||||||
|
QUtf8StringView sv2;
|
||||||
|
QT_TEST_ALL_COMPARISON_OPS(sv2, sv1, Qt::strong_ordering::equal);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Char, size_t HSize, size_t LHSize, size_t WNSize>
|
||||||
|
static void testLiteralsWithType(const Char (&hello)[HSize], const Char (&longhello)[LHSize], const Char (&withnull)[WNSize])
|
||||||
|
{
|
||||||
|
QCOMPARE(QUtf8StringView(hello).size(), 5);
|
||||||
|
QCOMPARE(QUtf8StringView(hello + 0).size(), 5); // forces decay to pointer
|
||||||
|
QUtf8StringView sv = hello;
|
||||||
|
QCOMPARE(sv.size(), 5);
|
||||||
|
QVERIFY(!sv.empty());
|
||||||
|
QVERIFY(!sv.isEmpty());
|
||||||
|
QVERIFY(!sv.isNull());
|
||||||
|
|
||||||
|
#ifdef __cpp_char8_t
|
||||||
|
QCOMPARE(*sv.utf8(), u8'H');
|
||||||
|
#endif
|
||||||
|
QCOMPARE(sv[0], u8'H');
|
||||||
|
QCOMPARE(sv.at(0), u8'H');
|
||||||
|
QCOMPARE(sv.front(), u8'H');
|
||||||
|
QCOMPARE(sv.first(1), u8'H');
|
||||||
|
QCOMPARE(sv[4], u8'o');
|
||||||
|
QCOMPARE(sv.at(4), u8'o');
|
||||||
|
QCOMPARE(sv.back(), u8'o');
|
||||||
|
QCOMPARE(sv.last(1), u8'o');
|
||||||
|
|
||||||
|
QCOMPARE(*sv.data(), 'H');
|
||||||
|
QCOMPARE(sv[0], 'H');
|
||||||
|
QCOMPARE(sv.at(0), 'H');
|
||||||
|
QCOMPARE(sv.front(), 'H');
|
||||||
|
QCOMPARE(sv.first(1), 'H');
|
||||||
|
QCOMPARE(sv[4], 'o');
|
||||||
|
QCOMPARE(sv.at(4), 'o');
|
||||||
|
QCOMPARE(sv.back(), 'o');
|
||||||
|
QCOMPARE(sv.last(1), 'o');
|
||||||
|
|
||||||
|
#ifdef __cpp_char8_t
|
||||||
|
{
|
||||||
|
QUtf8StringView sv2(sv.utf8(), sv.utf8() + sv.size());
|
||||||
|
QVERIFY(!sv2.isNull());
|
||||||
|
QVERIFY(!sv2.empty());
|
||||||
|
QCOMPARE(sv2.size(), 5);
|
||||||
|
QCOMPARE(sv, sv2);
|
||||||
|
QCOMPARE(sv.data(), sv2.data());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QUtf8StringView sv2(sv.data(), sv.data() + sv.size());
|
||||||
|
QVERIFY(!sv2.isNull());
|
||||||
|
QVERIFY(!sv2.empty());
|
||||||
|
QCOMPARE(sv2.size(), 5);
|
||||||
|
QCOMPARE(sv, sv2);
|
||||||
|
QCOMPARE(sv.data(), sv2.data());
|
||||||
|
|
||||||
|
QUtf8StringView sv3(longhello);
|
||||||
|
QCOMPARE(size_t(sv3.size()), sizeof(longhello)/sizeof(longhello[0]) - 1);
|
||||||
|
QCOMPARE(sv3.last(1), u'.');
|
||||||
|
sv3 = longhello;
|
||||||
|
QCOMPARE(size_t(sv3.size()), sizeof(longhello)/sizeof(longhello[0]) - 1);
|
||||||
|
|
||||||
|
for (int i = 0; i < sv3.size(); ++i) {
|
||||||
|
QUtf8StringView sv4(longhello + i);
|
||||||
|
QCOMPARE(size_t(sv4.size()), sizeof(longhello)/sizeof(longhello[0]) - 1 - i);
|
||||||
|
QCOMPARE(sv4.last(1), u'.');
|
||||||
|
sv4 = longhello + i;
|
||||||
|
QCOMPARE(size_t(sv4.size()), sizeof(longhello)/sizeof(longhello[0]) - 1 - i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// these are different results
|
||||||
|
QCOMPARE(size_t(QUtf8StringView(withnull).size()), size_t(1));
|
||||||
|
QCOMPARE(size_t(QUtf8StringView::fromArray(withnull).size()), sizeof(withnull)/sizeof(withnull[0]));
|
||||||
|
QCOMPARE(QUtf8StringView(withnull + 0).size(), qsizetype(1));
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void tst_QUtf8StringView::literalsChar8()
|
||||||
|
{
|
||||||
|
#ifdef __cpp_char8_t
|
||||||
|
const char8_t hello[] = u8"Hello";
|
||||||
|
const char8_t longhello[] =
|
||||||
|
u8"Hello World. This is a much longer message, to exercise qustrlen.";
|
||||||
|
const char8_t withnull[] = u8"a\0zzz";
|
||||||
|
static_assert(sizeof(longhello) >= 16);
|
||||||
|
|
||||||
|
testLiteralsWithType(hello, longhello, withnull);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QUtf8StringView::literalsChar()
|
||||||
|
{
|
||||||
|
const char hello[] = "Hello";
|
||||||
|
const char longhello[] =
|
||||||
|
"Hello World. This is a much longer message, to exercise qustrlen.";
|
||||||
|
const char withnull[] = "a\0zzz";
|
||||||
|
static_assert(sizeof(longhello) >= 16);
|
||||||
|
|
||||||
|
testLiteralsWithType(hello, longhello, withnull);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QUtf8StringView::construction()
|
void tst_QUtf8StringView::construction()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -206,6 +324,11 @@ void tst_QUtf8StringView::at()
|
|||||||
|
|
||||||
void tst_QUtf8StringView::arg() const
|
void tst_QUtf8StringView::arg() const
|
||||||
{
|
{
|
||||||
|
// nullness checks
|
||||||
|
QCOMPARE(QUtf8StringView().arg(QUtf8StringView()), "");
|
||||||
|
QCOMPARE(QUtf8StringView("%1").arg(nullptr), "");
|
||||||
|
QCOMPARE(QUtf8StringView(u8"%1").arg(nullptr), "");
|
||||||
|
|
||||||
#define CHECK1(pattern, arg1, expected) \
|
#define CHECK1(pattern, arg1, expected) \
|
||||||
do { \
|
do { \
|
||||||
auto p = QUtf8StringView(pattern); \
|
auto p = QUtf8StringView(pattern); \
|
||||||
@ -249,6 +372,119 @@ void tst_QUtf8StringView::arg() const
|
|||||||
" \r \r c C ");
|
" \r \r c C ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_QUtf8StringView::fromQString()
|
||||||
|
{
|
||||||
|
QString null;
|
||||||
|
QString empty = "";
|
||||||
|
QString normal = "hello";
|
||||||
|
|
||||||
|
QVERIFY( QUtf8StringView(null.toUtf8()).isNull());
|
||||||
|
QVERIFY( QUtf8StringView(null.toUtf8()).isEmpty());
|
||||||
|
QVERIFY( QUtf8StringView(empty.toUtf8()).isEmpty());
|
||||||
|
QVERIFY(!QUtf8StringView(empty.toUtf8()).isNull());
|
||||||
|
QVERIFY(!QUtf8StringView(normal.toUtf8()).isEmpty());
|
||||||
|
QVERIFY(!QUtf8StringView(normal.toUtf8()).isNull());
|
||||||
|
QCOMPARE(QUtf8StringView(normal.toUtf8()), u"hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QUtf8StringView::comparison()
|
||||||
|
{
|
||||||
|
const QUtf8StringView aa = u8"aa";
|
||||||
|
const QUtf8StringView upperAa = u8"AA";
|
||||||
|
const QUtf8StringView bb = u8"bb";
|
||||||
|
|
||||||
|
QVERIFY(aa == aa);
|
||||||
|
QVERIFY(aa != bb);
|
||||||
|
QVERIFY(aa < bb);
|
||||||
|
QVERIFY(bb > aa);
|
||||||
|
|
||||||
|
QT_TEST_ALL_COMPARISON_OPS(aa, aa, Qt::strong_ordering::equal);
|
||||||
|
QT_TEST_ALL_COMPARISON_OPS(aa, bb, Qt::strong_ordering::less);
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
void tst_QUtf8StringView::std_stringview_conversion()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
QUtf8StringView s;
|
||||||
|
std::basic_string_view<QUtf8StringView::storage_type> sv(s);
|
||||||
|
QCOMPARE(sv, std::basic_string_view<QUtf8StringView::storage_type>());
|
||||||
|
|
||||||
|
s = u8"";
|
||||||
|
sv = s;
|
||||||
|
QCOMPARE(s.size(), 0);
|
||||||
|
QCOMPARE(sv.size(), size_t(0));
|
||||||
|
QCOMPARE(sv, std::basic_string_view<QUtf8StringView::storage_type>());
|
||||||
|
|
||||||
|
s = u8"Hello";
|
||||||
|
sv = s;
|
||||||
|
QCOMPARE(sv, std::basic_string_view<QUtf8StringView::storage_type>("Hello"));
|
||||||
|
|
||||||
|
s = QUtf8StringView::fromArray(u8"Hello\0world");
|
||||||
|
sv = s;
|
||||||
|
QCOMPARE(s.size(), 12);
|
||||||
|
QCOMPARE(sv.size(), size_t(12));
|
||||||
|
QCOMPARE(sv, std::basic_string_view<QUtf8StringView::storage_type>("Hello\0world\0", 12));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace QUtf8StringViewOverloadResolution {
|
||||||
|
// QString and QUtf8StringView overloads are ambiguous
|
||||||
|
// static void test(QString) { }
|
||||||
|
// but QStringView and QUtf8StringView work
|
||||||
|
static void test(QStringView) = delete;
|
||||||
|
static void test(QUtf8StringView) { }
|
||||||
|
}
|
||||||
|
#ifdef __cpp_char8_t
|
||||||
|
extern const char8_t char8ArrayOfUnknownSize[];
|
||||||
|
#endif
|
||||||
|
extern const char charArrayOfUnknownSize[];
|
||||||
|
|
||||||
|
void tst_QUtf8StringView::overloadResolution()
|
||||||
|
{
|
||||||
|
#ifdef __cpp_char8_t
|
||||||
|
{
|
||||||
|
char8_t char8Array[] = u8"test";
|
||||||
|
QUtf8StringViewOverloadResolution::test(char8Array);
|
||||||
|
char8_t *char8Pointer = char8Array;
|
||||||
|
QUtf8StringViewOverloadResolution::test(char8Pointer);
|
||||||
|
QUtf8StringViewOverloadResolution::test(char8ArrayOfUnknownSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::u8string string;
|
||||||
|
QUtf8StringViewOverloadResolution::test(string);
|
||||||
|
QUtf8StringViewOverloadResolution::test(std::as_const(string));
|
||||||
|
QUtf8StringViewOverloadResolution::test(std::move(string));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
{
|
||||||
|
char charArray[] = "test";
|
||||||
|
QUtf8StringViewOverloadResolution::test(charArray);
|
||||||
|
char *charPointer = charArray;
|
||||||
|
QUtf8StringViewOverloadResolution::test(charPointer);
|
||||||
|
QUtf8StringViewOverloadResolution::test(charArrayOfUnknownSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
std::string string;
|
||||||
|
QUtf8StringViewOverloadResolution::test(string);
|
||||||
|
QUtf8StringViewOverloadResolution::test(std::as_const(string));
|
||||||
|
QUtf8StringViewOverloadResolution::test(std::move(string));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cpp_char8_t
|
||||||
|
const char8_t char8ArrayOfUnknownSize[] = u8"abc\0def";
|
||||||
|
#endif
|
||||||
|
const char charArrayOfUnknownSize[] = "abc\0def";
|
||||||
|
|
||||||
void tst_QUtf8StringView::midLeftRight()
|
void tst_QUtf8StringView::midLeftRight()
|
||||||
{
|
{
|
||||||
const QUtf8StringView utf8("Hello World");
|
const QUtf8StringView utf8("Hello World");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user