summaryrefslogtreecommitdiffstats
path: root/src/testlib/qtest.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/testlib/qtest.h')
-rw-r--r--src/testlib/qtest.h62
1 files changed, 56 insertions, 6 deletions
diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h
index f4f0ff5dfd..99eae8553f 100644
--- a/src/testlib/qtest.h
+++ b/src/testlib/qtest.h
@@ -65,7 +65,7 @@ template<> inline char *toString(const QLatin1StringView &str)
template<> inline char *toString(const QByteArray &ba)
{
- return QTest::toPrettyCString(ba.constData(), ba.length());
+ return QTest::toPrettyCString(ba.constData(), ba.size());
}
template<> inline char *toString(const QBitArray &ba)
@@ -207,6 +207,19 @@ template<> inline char *toString(const QVariant &v)
return qstrdup(vstring.constData());
}
+template<> inline char *toString(const QPartialOrdering &o)
+{
+ if (o == QPartialOrdering::Less)
+ return qstrdup("Less");
+ if (o == QPartialOrdering::Equivalent)
+ return qstrdup("Equivalent");
+ if (o == QPartialOrdering::Greater)
+ return qstrdup("Greater");
+ if (o == QPartialOrdering::Unordered)
+ return qstrdup("Unordered");
+ return qstrdup("<invalid>");
+}
+
namespace Internal {
struct QCborValueFormatter
{
@@ -343,6 +356,19 @@ template<> inline char *toString(const QCborMap &m)
return Internal::QCborValueFormatter::format(m);
}
+template <typename Rep, typename Period> char *toString(std::chrono::duration<Rep, Period> dur)
+{
+ QString r;
+ QDebug d(&r);
+ d.nospace() << qSetRealNumberPrecision(9) << dur;
+ if constexpr (Period::num != 1 || Period::den != 1) {
+ // include the equivalent value in seconds, in parentheses
+ using namespace std::chrono;
+ d << " (" << duration_cast<duration<qreal>>(dur).count() << "s)";
+ }
+ return qstrdup(std::move(r).toUtf8().constData());
+}
+
template <typename T1, typename T2>
inline char *toString(const std::pair<T1, T2> &pair)
{
@@ -351,8 +377,8 @@ inline char *toString(const std::pair<T1, T2> &pair)
return formatString("std::pair(", ")", 2, first.data(), second.data());
}
-template <typename Tuple, int... I>
-inline char *toString(const Tuple & tuple, QtPrivate::IndexesList<I...>) {
+template <typename Tuple, std::size_t... I>
+inline char *tupleToString(const Tuple &tuple, std::index_sequence<I...>) {
using UP = std::unique_ptr<char[]>;
// Generate a table of N + 1 elements where N is the number of
// elements in the tuple.
@@ -366,13 +392,12 @@ inline char *toString(const Tuple & tuple, QtPrivate::IndexesList<I...>) {
template <class... Types>
inline char *toString(const std::tuple<Types...> &tuple)
{
- static const std::size_t params_count = sizeof...(Types);
- return toString(tuple, typename QtPrivate::Indexes<params_count>::Value());
+ return tupleToString(tuple, std::make_index_sequence<sizeof...(Types)>{});
}
inline char *toString(std::nullptr_t)
{
- return toString(QStringLiteral("nullptr"));
+ return toString(QStringView(u"nullptr"));
}
template<>
@@ -582,6 +607,7 @@ struct QtCoverageScanner
#define TESTLIB_SELFCOVERAGE_START(name)
#endif
+#if !defined(QTEST_BATCH_TESTS)
// Internal (but used by some testlib selftests to hack argc and argv).
// Tests should normally implement initMain() if they have set-up to do before
// instantiating the test class.
@@ -595,6 +621,30 @@ int main(int argc, char *argv[]) \
QTEST_SET_MAIN_SOURCE_PATH \
return QTest::qExec(&tc, argc, argv); \
}
+#else
+// BATCHED_TEST_NAME is defined for each test in a batch in cmake. Some odd
+// targets, like snippets, don't define it though. Play safe by providing a
+// default value.
+#if !defined(BATCHED_TEST_NAME)
+#define BATCHED_TEST_NAME "other"
+#endif
+#define QTEST_MAIN_WRAPPER(TestObject, ...) \
+\
+void qRegister##TestObject() \
+{ \
+ auto runTest = [](int argc, char** argv) -> int { \
+ TESTLIB_SELFCOVERAGE_START(TestObject) \
+ QT_PREPEND_NAMESPACE(QTest::Internal::callInitMain)<TestObject>(); \
+ __VA_ARGS__ \
+ TestObject tc; \
+ QTEST_SET_MAIN_SOURCE_PATH \
+ return QTest::qExec(&tc, argc, argv); \
+ }; \
+ QTest::qRegisterTestCase(QStringLiteral(BATCHED_TEST_NAME), runTest); \
+} \
+\
+Q_CONSTRUCTOR_FUNCTION(qRegister##TestObject)
+#endif
// For when you don't even want a QApplication:
#define QTEST_APPLESS_MAIN(TestObject) QTEST_MAIN_WRAPPER(TestObject)