tst_QAnyStringView: test some longer strings and some containing nulls

Change-Id: Ieab617d69f3b4b54ab30fffd175c9cbb4f5d19b9
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
Reviewed-by: Samuel Gaist <samuel.gaist@idiap.ch>
Reviewed-by: Sze Howe Koh <szehowe.koh@gmail.com>
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
bb10
Thiago Macieira 2023-05-06 10:04:49 -07:00
parent 8efe154aa5
commit fe53fce15f
1 changed files with 102 additions and 35 deletions

View File

@ -252,6 +252,50 @@ static_assert(CanConvert<const winrt::hstring&>);
#endif // QT_CONFIG(cpp_winrt)
template <typename Char> 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<char16_t>
{
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<QChar>
{
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<char16_t>::stringWithNullsLength;
};
const QChar *const SampleStrings<QChar>::regularString =
reinterpret_cast<const QChar *>(SampleStrings<char16_t>::regularString);
const QChar *const SampleStrings<QChar>::regularLongString =
reinterpret_cast<const QChar *>(SampleStrings<char16_t>::regularLongString);
const QChar *const SampleStrings<QChar>::stringWithNulls =
reinterpret_cast<const QChar *>(SampleStrings<char16_t>::stringWithNulls);
class tst_QAnyStringView : public QObject
{
@ -264,6 +308,8 @@ private Q_SLOTS:
void fromQString() const { fromQStringOrByteArray<QString>(); }
void fromQByteArray() const { fromQStringOrByteArray<QByteArray>(); }
void fromQStringView() const { fromQStringOrByteArray<QStringView>(); }
void fromQUtf8StringView() const { fromQStringOrByteArray<QUtf8StringView>(); }
void fromCharArray() const { fromArray<char>(); }
void fromChar8Array() const { ONLY_IF_CHAR_8_T(fromArray<char8_t>()); }
@ -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<char>(); }
void fromChar8TRange() const { ONLY_IF_CHAR_8_T(fromRange<char8_t>()); }
void fromQCharRange() const { fromRange<QChar>(); }
void fromUShortRange() const { fromRange<ushort>(); }
void fromChar16TRange() const { fromRange<char16_t>(); }
void fromWCharTRange() const { ONLY_WIN(fromRange<wchar_t>()); }
// std::basic_string
void fromStdStringChar() const { fromStdString<char>(); }
@ -341,7 +370,7 @@ private:
template <typename Char>
void fromLiteral(const Char *arg) const;
template <typename Char>
void fromRange(const Char *first, const Char *last) const;
void fromRange() const;
template <typename Char, typename Container>
void fromContainer() const;
template <typename Char>
@ -499,18 +528,28 @@ void tst_QAnyStringView::fromArray() const
QCOMPARE(sv2.back(), u'c');
}
template <typename QStringOrByteArray>
void tst_QAnyStringView::fromQStringOrByteArray() const
{
using Char = std::remove_cv_t<typename QStringOrByteArray::value_type>;
using Strings = SampleStrings<Char>;
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 <typename Char>
@ -534,27 +573,48 @@ void tst_QAnyStringView::fromLiteral(const Char *arg) const
}
template <typename Char>
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<const void*>(QAnyStringView(first, first).data()),
static_cast<const void*>(first));
const auto sv = QAnyStringView(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
};
const Char *null = nullptr;
using RealChar = std::conditional_t<sizeof(Char) == 1, char, char16_t>;
using Strings = SampleStrings<RealChar>;
QCOMPARE(QAnyStringView(null, null).size(), 0);
QCOMPARE(QAnyStringView(null, null).data(), nullptr);
QCOMPARE(QAnyStringView(first, first).size(), 0);
QCOMPARE(static_cast<const void*>(QAnyStringView(first, first).data()),
static_cast<const void*>(first));
const auto sv = QAnyStringView(first, last);
QCOMPARE(sv.size(), last - first);
QCOMPARE(static_cast<const void*>(sv.data()),
static_cast<const void*>(first));
doTest(reinterpret_cast<const Char *>(std::begin(Strings::regularString)),
reinterpret_cast<const Char *>(std::end(Strings::regularString)));
if (QTest::currentTestFailed())
return;
// can't call conversion_tests() here, as it requires a single object
doTest(reinterpret_cast<const Char *>(std::begin(Strings::regularLongString)),
reinterpret_cast<const Char *>(std::end(Strings::regularLongString)));
if (QTest::currentTestFailed())
return;
doTest(reinterpret_cast<const Char *>(std::begin(Strings::stringWithNulls)),
reinterpret_cast<const Char *>(std::end(Strings::stringWithNulls)));
if (QTest::currentTestFailed())
return;
}
template <typename Char, typename Container>
void tst_QAnyStringView::fromContainer() const
{
const std::string s = "Hello World!";
const std::string n(SampleStrings<char>::stringWithNulls, SampleStrings<char>::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 <typename Char>