diff options
Diffstat (limited to 'src/testlib/qtest.h')
-rw-r--r-- | src/testlib/qtest.h | 62 |
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) |