tst_QSpan: port to QTEST_THROW_ON_FAIL

Dogfooding the new QtTest 6.8 feature, and greatly simplifiying the
source code.

Change-Id: I0731d7291048e6bbed19666d1b6672e5cccaf27a
Reviewed-by: Ahmad Samir <a.samirh78@gmail.com>
(cherry picked from commit 157fcdf5afbe4e6b421713947ccdb4ee35116ee4)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Marc Mutz 2024-06-17 09:27:18 +02:00 committed by Qt Cherry-pick Bot
parent 9a86dba130
commit ada5f8b646
3 changed files with 10 additions and 30 deletions

View File

@ -47,7 +47,9 @@ add_subdirectory(qset)
add_subdirectory(qsharedpointer) add_subdirectory(qsharedpointer)
add_subdirectory(qsize) add_subdirectory(qsize)
add_subdirectory(qsizef) add_subdirectory(qsizef)
if (NOT WASM) # QTBUG-121822
add_subdirectory(qspan) add_subdirectory(qspan)
endif()
add_subdirectory(qstl) add_subdirectory(qstl)
add_subdirectory(quniquehandle) add_subdirectory(quniquehandle)
add_subdirectory(qvarlengtharray) add_subdirectory(qvarlengtharray)

View File

@ -10,4 +10,8 @@ endif()
qt_internal_add_test(tst_qspan qt_internal_add_test(tst_qspan
SOURCES SOURCES
tst_qspan.cpp tst_qspan.cpp
NO_BATCH # QTBUG-121815
DEFINES
QTEST_THROW_ON_FAIL
QTEST_THROW_ON_SKIP
) )

View File

@ -6,6 +6,10 @@
#include <QList> #include <QList>
#include <QTest> #include <QTest>
#ifndef QTEST_THROW_ON_FAIL
# error This test requires QTEST_THROW_ON_FAIL being active.
#endif
#include <algorithm> #include <algorithm>
#include <array> #include <array>
#ifdef __cpp_lib_span #ifdef __cpp_lib_span
@ -144,9 +148,6 @@ private:
template <typename T> template <typename T>
const void *as_const_void(T *p) noexcept { return static_cast<const void *>(p); } const void *as_const_void(T *p) noexcept { return static_cast<const void *>(p); }
#define RETURN_IF_FAILED() \
do { if (QTest::currentTestFailed()) return; } while (false)
void tst_QSpan::onlyZeroExtentSpansHaveDefaultCtors() const void tst_QSpan::onlyZeroExtentSpansHaveDefaultCtors() const
{ {
static_assert(std::is_nothrow_default_constructible_v<QSpan<int, 0>>); static_assert(std::is_nothrow_default_constructible_v<QSpan<int, 0>>);
@ -156,19 +157,15 @@ void tst_QSpan::onlyZeroExtentSpansHaveDefaultCtors() const
QSpan<int, 0> si; QSpan<int, 0> si;
check_null_span(si); check_null_span(si);
RETURN_IF_FAILED();
QSpan<const int, 0> sci; QSpan<const int, 0> sci;
check_null_span(sci); check_null_span(sci);
RETURN_IF_FAILED();
QSpan<int> sdi; QSpan<int> sdi;
check_null_span(sdi); check_null_span(sdi);
RETURN_IF_FAILED();
QSpan<const int> sdci; QSpan<const int> sdci;
check_null_span(sdci); check_null_span(sdci);
RETURN_IF_FAILED();
static_assert(!std::is_default_constructible_v<QSpan<int, 1>>); static_assert(!std::is_default_constructible_v<QSpan<int, 1>>);
static_assert(!std::is_default_constructible_v<QSpan<const int, 42>>); static_assert(!std::is_default_constructible_v<QSpan<const int, 42>>);
@ -180,22 +177,18 @@ void tst_QSpan::zeroExtentSpansMaintainADataPointer() const
QSpan<int, 0> si{&i, 0}; QSpan<int, 0> si{&i, 0};
QCOMPARE(si.data(), &i); QCOMPARE(si.data(), &i);
check_empty_span_incl_subspans(si); check_empty_span_incl_subspans(si);
RETURN_IF_FAILED();
QSpan<const int, 0> sci{&i, 0}; QSpan<const int, 0> sci{&i, 0};
QCOMPARE(sci.data(), &i); QCOMPARE(sci.data(), &i);
check_empty_span_incl_subspans(sci); check_empty_span_incl_subspans(sci);
RETURN_IF_FAILED();
QSpan<int, 0> sdi{&i, 0}; QSpan<int, 0> sdi{&i, 0};
QCOMPARE(sdi.data(), &i); QCOMPARE(sdi.data(), &i);
check_empty_span_incl_subspans(sdi); check_empty_span_incl_subspans(sdi);
RETURN_IF_FAILED();
QSpan<const int, 0> sdci{&i, 0}; QSpan<const int, 0> sdci{&i, 0};
QCOMPARE(sdci.data(), &i); QCOMPARE(sdci.data(), &i);
check_empty_span_incl_subspans(sdci); check_empty_span_incl_subspans(sdci);
RETURN_IF_FAILED();
} }
template <typename T, std::size_t N> template <typename T, std::size_t N>
@ -233,18 +226,14 @@ void tst_QSpan::check_nonempty_span(QSpan<T, N> s, qsizetype expectedSize) const
// don't run into Mandates: Offset >= Extent // don't run into Mandates: Offset >= Extent
if constexpr (N > 0) { // incl. N == std::dynamic_extent if constexpr (N > 0) { // incl. N == std::dynamic_extent
check_empty_span_incl_subspans(s.template subspan<1>()); check_empty_span_incl_subspans(s.template subspan<1>());
RETURN_IF_FAILED();
} }
check_empty_span_incl_subspans(s.subspan(1)); check_empty_span_incl_subspans(s.subspan(1));
RETURN_IF_FAILED();
} else { } else {
// don't run into Mandates: Offset >= Extent // don't run into Mandates: Offset >= Extent
if constexpr (N > 1) { // incl. N == std::dynamic_extent if constexpr (N > 1) { // incl. N == std::dynamic_extent
check_nonempty_span(s.template subspan<1>(), expectedSize - 1); check_nonempty_span(s.template subspan<1>(), expectedSize - 1);
RETURN_IF_FAILED();
} }
check_nonempty_span(s.subspan(1), expectedSize - 1); check_nonempty_span(s.subspan(1), expectedSize - 1);
RETURN_IF_FAILED();
} }
} }
@ -266,55 +255,46 @@ template <typename T, std::size_t N>
void tst_QSpan::check_empty_span_incl_subspans(QSpan<T, N> s) const void tst_QSpan::check_empty_span_incl_subspans(QSpan<T, N> s) const
{ {
check_empty_span(s); check_empty_span(s);
RETURN_IF_FAILED();
{ {
const auto fi = s.template first<0>(); const auto fi = s.template first<0>();
check_empty_span(fi); check_empty_span(fi);
RETURN_IF_FAILED();
QCOMPARE_EQ(fi.data(), s.data()); QCOMPARE_EQ(fi.data(), s.data());
} }
{ {
const auto la = s.template last<0>(); const auto la = s.template last<0>();
check_empty_span(la); check_empty_span(la);
RETURN_IF_FAILED();
QCOMPARE_EQ(la.data(), s.data()); QCOMPARE_EQ(la.data(), s.data());
} }
{ {
const auto ss = s.template subspan<0>(); const auto ss = s.template subspan<0>();
check_empty_span(ss); check_empty_span(ss);
RETURN_IF_FAILED();
QCOMPARE_EQ(ss.data(), s.data()); QCOMPARE_EQ(ss.data(), s.data());
} }
{ {
const auto ss = s.template subspan<0, 0>(); const auto ss = s.template subspan<0, 0>();
check_empty_span(ss); check_empty_span(ss);
RETURN_IF_FAILED();
QCOMPARE_EQ(ss.data(), s.data()); QCOMPARE_EQ(ss.data(), s.data());
} }
{ {
const auto fi = s.first(0); const auto fi = s.first(0);
check_empty_span(fi); check_empty_span(fi);
RETURN_IF_FAILED();
QCOMPARE_EQ(fi.data(), s.data()); QCOMPARE_EQ(fi.data(), s.data());
} }
{ {
const auto la = s.last(0); const auto la = s.last(0);
check_empty_span(la); check_empty_span(la);
RETURN_IF_FAILED();
QCOMPARE_EQ(la.data(), s.data()); QCOMPARE_EQ(la.data(), s.data());
} }
{ {
const auto ss = s.subspan(0); const auto ss = s.subspan(0);
check_empty_span(ss); check_empty_span(ss);
RETURN_IF_FAILED();
QCOMPARE_EQ(ss.data(), s.data()); QCOMPARE_EQ(ss.data(), s.data());
} }
{ {
const auto ss = s.subspan(0, 0); const auto ss = s.subspan(0, 0);
check_empty_span(ss); check_empty_span(ss);
RETURN_IF_FAILED();
QCOMPARE_EQ(ss.data(), s.data()); QCOMPARE_EQ(ss.data(), s.data());
} }
} }
@ -347,7 +327,6 @@ void tst_QSpan::from_container_impl(C &&c) const
QCOMPARE_EQ(si.data(), c_data); QCOMPARE_EQ(si.data(), c_data);
check_nonempty_span(si, c_size); check_nonempty_span(si, c_size);
RETURN_IF_FAILED();
auto bi = as_bytes(si); auto bi = as_bytes(si);
static_assert(std::is_same_v<decltype(bi), QSpan<const std::byte, ExpectedBytesExtent>>); static_assert(std::is_same_v<decltype(bi), QSpan<const std::byte, ExpectedBytesExtent>>);
@ -369,7 +348,6 @@ void tst_QSpan::from_container_impl(C &&c) const
QCOMPARE_EQ(sci.data(), c_data); QCOMPARE_EQ(sci.data(), c_data);
check_nonempty_span(sci, c_size); check_nonempty_span(sci, c_size);
RETURN_IF_FAILED();
auto bci = as_bytes(sci); auto bci = as_bytes(sci);
static_assert(std::is_same_v<decltype(bci), QSpan<const std::byte>>); static_assert(std::is_same_v<decltype(bci), QSpan<const std::byte>>);
@ -385,7 +363,6 @@ void tst_QSpan::from_container_impl(C &&c) const
QCOMPARE_EQ(sci.data(), c_data); QCOMPARE_EQ(sci.data(), c_data);
check_nonempty_span(sci, c_size); check_nonempty_span(sci, c_size);
RETURN_IF_FAILED();
auto bci = as_bytes(sci); auto bci = as_bytes(sci);
static_assert(std::is_same_v<decltype(bci), QSpan<const std::byte, ExpectedBytesExtent>>); static_assert(std::is_same_v<decltype(bci), QSpan<const std::byte, ExpectedBytesExtent>>);
@ -426,7 +403,6 @@ void tst_QSpan::fromStdInitializerList() const
QCOMPARE_EQ(sci.data(), il.begin()); QCOMPARE_EQ(sci.data(), il.begin());
check_nonempty_span(sci, 4); check_nonempty_span(sci, 4);
RETURN_IF_FAILED();
} }
void tst_QSpan::fromZeroSizeStdArray() const void tst_QSpan::fromZeroSizeStdArray() const
@ -475,7 +451,5 @@ void tst_QSpan::fromInitList() const
l2({4, 5, 6}); l2({4, 5, 6});
} }
#undef RETURN_IF_FAILED
QTEST_APPLESS_MAIN(tst_QSpan); QTEST_APPLESS_MAIN(tst_QSpan);
#include "tst_qspan.moc" #include "tst_qspan.moc"