7#include <QtTest/qttestglobal.h>
9#include <QtCore/qstring.h>
10#include <QtCore/qnamespace.h>
11#include <QtCore/qmetatype.h>
12#include <QtCore/qmetaobject.h>
13#include <QtCore/qsharedpointer.h>
14#include <QtCore/qtemporarydir.h>
15#include <QtCore/qthread.h>
16#include <QtCore/qxpfunctional.h>
20#ifndef QT_NO_EXCEPTIONS
29#define QVERIFY(statement) \
31 if (!QTest::qVerify(static_cast<bool>(statement), #statement, "", __FILE__, __LINE__))\
35#define QFAIL(message) \
37 QTest::qFail(static_cast<const char *>(message), __FILE__, __LINE__);\
41#define QVERIFY2(statement, description) \
44 if (!QTest::qVerify(true, #statement, static_cast<const char *>(description), __FILE__, __LINE__))\
47 if (!QTest::qVerify(false, #statement, static_cast<const char *>(description), __FILE__, __LINE__))\
52#define QCOMPARE(actual, expected) \
54 if (!QTest::qCompare(actual, expected, #actual, #expected, __FILE__, __LINE__))\
62#define QCOMPARE_OP_IMPL(lhs, rhs, op, opId) \
64 if ( { \
66 return QTest::reportResult(std::forward<decltype(qt_lhs_arg)>(qt_lhs_arg) \
68 std::forward<decltype(qt_rhs_arg)>(qt_rhs_arg), \
69 [&qt_lhs_arg] { return QTest::toString(qt_lhs_arg); }, \
70 [&qt_rhs_arg] { return QTest::toString(qt_rhs_arg); }, \
71 #lhs, #rhs, QTest::ComparisonOperation::opId, \
72 __FILE__, __LINE__); \
78#define QCOMPARE_EQ(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, ==, Equal)
79#define QCOMPARE_NE(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, !=, NotEqual)
80#define QCOMPARE_LT(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, <, LessThan)
81#define QCOMPARE_LE(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, <=, LessThanOrEqual)
82#define QCOMPARE_GT(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, >, GreaterThan)
83#define QCOMPARE_GE(computed, baseline) QCOMPARE_OP_IMPL(computed, baseline, >=, GreaterThanOrEqual)
85#ifndef QT_NO_EXCEPTIONS
87# define QVERIFY_THROWS_NO_EXCEPTION(...) \
92 } QT_CATCH (const std::exception &e) { \
93 QTest::qCaught(nullptr, e.what(), __FILE__, __LINE__); \
96 QTest::qCaught(nullptr, nullptr, __FILE__, __LINE__); \
102#if QT_DEPRECATED_SINCE(6, 3)
105 "use QVERIFY_THROWS_EXCEPTION(type, expr...) instead")
106inline void useVerifyThrowsException() {}
108# define QVERIFY_EXCEPTION_THROWN(expression, exceptiontype) \
109 QVERIFY_THROWS_EXCEPTION(exceptiontype, QTest::useVerifyThrowsException(); expression)
112# define QVERIFY_THROWS_EXCEPTION(exceptiontype, ...) \
117 QTest::qFail("Expected exception of type " #exceptiontype " to be thrown" \
118 " but no exception caught", __FILE__, __LINE__);\
120 } QT_CATCH (const exceptiontype &) {\
123 } QT_CATCH (const std::exception &e) {\
124 QTest::qCaught(#exceptiontype, e.what(), __FILE__, __LINE__);\
127 QTest::qCaught(#exceptiontype, nullptr, __FILE__, __LINE__);\
141# define QVERIFY_THROWS_EXCEPTION(...) \
142 static_assert(false, "Support for exceptions is disabled")
143# define QVERIFY_THROWS_NO_EXCEPTION(...) \
144 static_assert(false, "Support for exceptions is disabled")
158#define QTRY_LOOP_IMPL(expr, timeoutValue, step) \
163 for (; qt_test_i < timeoutValue && !(QTest::runningTest() && QTest::currentTestResolved()) \
164 && !(expr); qt_test_i += step) { \
165 QTest::qWait(step); \
169#define QTRY_TIMEOUT_DEBUG_IMPL(expr, timeoutValue, step) \
170 if (!(QTest::runningTest() && QTest::currentTestResolved()) && !(expr)) { \
171 QTRY_LOOP_IMPL(expr, 2 * (timeoutValue), step) \
173 QFAIL(qPrintable(QTest::Internal::formatTryTimeoutDebugMessage(\
174 u8"" #expr, timeoutValue, timeoutValue + qt_test_i))); \
178#define QTRY_IMPL(expr, timeout)\
179 const int qt_test_step = timeout < 350 ? timeout / 7 + 1 : 50; \
180 const int qt_test_timeoutValue = timeout; \
181 { QTRY_LOOP_IMPL(expr, qt_test_timeoutValue, qt_test_step) } \
182 QTRY_TIMEOUT_DEBUG_IMPL(expr, qt_test_timeoutValue, qt_test_step)
186#define QTRY_VERIFY_WITH_TIMEOUT(expr, timeout) \
188 QTRY_IMPL(expr, timeout) \
192#define QTRY_VERIFY(expr) QTRY_VERIFY_WITH_TIMEOUT(expr, 5000)
195#define QTRY_VERIFY2_WITH_TIMEOUT(expr, messageExpression, timeout) \
197 QTRY_IMPL(expr, timeout) \
198 QVERIFY2(expr, messageExpression); \
201#define QTRY_VERIFY2(expr, messageExpression) QTRY_VERIFY2_WITH_TIMEOUT(expr, messageExpression, 5000)
204#define QTRY_COMPARE_WITH_TIMEOUT(expr, expected, timeout) \
206 QTRY_IMPL((expr) == (expected), timeout) \
207 QCOMPARE(expr, expected); \
210#define QTRY_COMPARE(expr, expected) QTRY_COMPARE_WITH_TIMEOUT(expr, expected, 5000)
212#define QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, op, opId, timeout) \
214 QTRY_IMPL(((computed) op (baseline)), timeout) \
215 QCOMPARE_OP_IMPL(computed, baseline, op, opId); \
218#define QTRY_COMPARE_EQ_WITH_TIMEOUT(computed, baseline, timeout) \
219 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, ==, Equal, timeout)
221#define QTRY_COMPARE_EQ(computed, baseline) QTRY_COMPARE_EQ_WITH_TIMEOUT(computed, baseline, 5000)
223#define QTRY_COMPARE_NE_WITH_TIMEOUT(computed, baseline, timeout) \
224 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, !=, NotEqual, timeout)
226#define QTRY_COMPARE_NE(computed, baseline) QTRY_COMPARE_NE_WITH_TIMEOUT(computed, baseline, 5000)
228#define QTRY_COMPARE_LT_WITH_TIMEOUT(computed, baseline, timeout) \
229 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, <, LessThan, timeout)
231#define QTRY_COMPARE_LT(computed, baseline) QTRY_COMPARE_LT_WITH_TIMEOUT(computed, baseline, 5000)
233#define QTRY_COMPARE_LE_WITH_TIMEOUT(computed, baseline, timeout) \
234 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, <=, LessThanOrEqual, timeout)
236#define QTRY_COMPARE_LE(computed, baseline) QTRY_COMPARE_LE_WITH_TIMEOUT(computed, baseline, 5000)
238#define QTRY_COMPARE_GT_WITH_TIMEOUT(computed, baseline, timeout) \
239 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, >, GreaterThan, timeout)
241#define QTRY_COMPARE_GT(computed, baseline) QTRY_COMPARE_GT_WITH_TIMEOUT(computed, baseline, 5000)
243#define QTRY_COMPARE_GE_WITH_TIMEOUT(computed, baseline, timeout) \
244 QTRY_COMPARE_OP_WITH_TIMEOUT_IMPL(computed, baseline, >=, GreaterThanOrEqual, timeout)
246#define QTRY_COMPARE_GE(computed, baseline) QTRY_COMPARE_GE_WITH_TIMEOUT(computed, baseline, 5000)
248#define QSKIP_INTERNAL(statement) \
250 QTest::qSkip(static_cast<const char *>(statement), __FILE__, __LINE__);\
254#define QSKIP(statement, ...) QSKIP_INTERNAL(statement)
256#define QEXPECT_FAIL(dataIndex, comment, mode)\
258 if (!QTest::qExpectFail(dataIndex, static_cast<const char *>(comment), QTest::mode, __FILE__, __LINE__))\
262#define QFETCH(Type, name)\
263 Type name = *static_cast<Type *>(QTest::qData(#name, ::qMetaTypeId<typename std::remove_cv<Type >::type>()))
265#define QFETCH_GLOBAL(Type, name)\
266 Type name = *static_cast<Type *>(QTest::qGlobalData(#name, ::qMetaTypeId<typename std::remove_cv<Type >::type>()))
268#define QTEST(actual, testElement)\
270 if (!QTest::qTest(actual, testElement, #actual, #testElement, __FILE__, __LINE__))\
274#ifdef QT_TESTCASE_BUILDDIR
276#ifndef QT_TESTCASE_SOURCEDIR
277#define QT_TESTCASE_SOURCEDIR nullptr
280# define QFINDTESTDATA(basepath)\
281 QTest::qFindTestData(basepath, __FILE__, __LINE__, QT_TESTCASE_BUILDDIR, QT_TESTCASE_SOURCEDIR)
283# define QFINDTESTDATA(basepath)\
284 QTest::qFindTestData(basepath, __FILE__, __LINE__)
287# define QEXTRACTTESTDATA(resourcePath) \
288 QTest::qExtractTestData(resourcePath)
293#define QTEST_COMPARE_DECL(KLASS)\
294 template<> Q_TESTLIB_EXPORT char *toString<KLASS >(const KLASS &);
303 inline typename std::enable_if<QtPrivate::IsQEnumHelper<T>::Value,
char*>
::type toString(T
e)
309 template <
typename T>
310 inline typename std::enable_if<!QtPrivate::IsQEnumHelper<T>::Value && std::is_enum_v<T>,
char*>
::type toString(
const T &
e)
315 template <
typename T>
316 inline typename std::enable_if<!QtPrivate::IsQEnumHelper<T>::Value && !std::is_enum_v<T>,
char *>
::type toString(
const T &
t)
319#ifndef QT_NO_DEBUG_STREAM
320 if constexpr (QTypeTraits::has_ostream_operator_v<QDebug, T>) {
324 "Built-in type must implement debug streaming operator "
325 "or provide QTest::toString specialization");
334 const QMetaEnum me = QMetaEnum::fromType<F>();
338 template <
typename F>
341 const size_t space = 3 + 2 *
sizeof(unsigned);
342 char *msg =
new char[space];
343 qsnprintf(msg, space,
"0x%x",
unsigned(
f.toInt()));
355 template <
typename T1,
typename T2>
358 template <
typename T1,
typename T2>
359 inline char *
toString(
const std::pair<T1, T2> &pair);
361 template <
class...
Types>
362 inline char *
toString(
const std::tuple<Types...> &tuple);
364 template <
typename Rep,
typename Period>
365 inline char *
toString(std::chrono::duration<Rep, Period> duration);
370 Q_TESTLIB_EXPORT
char *
toString(
const char *);
371 Q_TESTLIB_EXPORT
char *
toString(
const volatile void *);
372 Q_TESTLIB_EXPORT
char *
toString(
const void *);
376 Q_TESTLIB_EXPORT
int qRun();
382#if QT_CONFIG(batch_test_support) || defined(Q_QDOC)
383 using TestEntryFunction = int (*)(int,
char **);
384 Q_TESTLIB_EXPORT
void qRegisterTestCase(
const QString &
name, TestEntryFunction entryFunction);
389 Q_TESTLIB_EXPORT
bool qVerify(
bool statement,
const char *statementStr,
const char *description,
398#if QT_DEPRECATED_SINCE(6, 3)
400 Q_TESTLIB_EXPORT
void qWarn(const
char *
message, const
char *
file =
nullptr,
int line = 0);
403#if QT_CONFIG(regularexpression)
407#if QT_CONFIG(regularexpression)
411#if QT_CONFIG(temporaryfile)
414 Q_TESTLIB_EXPORT
QString qFindTestData(
const char* basepath,
const char*
file =
nullptr,
int line = 0,
const char* builddir =
nullptr,
const char* sourcedir =
nullptr);
415 Q_TESTLIB_EXPORT
QString qFindTestData(
const QString& basepath,
const char*
file =
nullptr,
int line = 0,
const char* builddir =
nullptr,
const char *sourcedir =
nullptr);
417 Q_TESTLIB_EXPORT
void *
qData(
const char *tagName,
int typeId);
418 Q_TESTLIB_EXPORT
void *
qGlobalData(
const char *tagName,
int typeId);
419 Q_TESTLIB_EXPORT
void *
qElementData(
const char *elementName,
int metaTypeId);
435#if QT_DEPRECATED_SINCE(6, 4)
437 "or an overload that takes only failure message, if you "
438 "do not need to stringify the values")
439 Q_TESTLIB_EXPORT
bool compare_helper(
bool success, const
char *failureMsg,
440 char *actualVal,
char *expectedVal,
441 const
char *actual, const
char *
expected,
444 Q_TESTLIB_EXPORT
bool compare_helper(
bool success,
const char *failureMsg,
447 const char *actual,
const char *
expected,
449 Q_TESTLIB_EXPORT
bool compare_helper(
bool success,
const char *failureMsg,
450 const char *actual,
const char *
expected,
455 template <
typename T>
458 using QIsSameTConstChar = std::is_same<T, const char*>;
459 static_assert(!QIsSameTConstChar::value,
"const char* is not allowed as a test data format.");
468 Q_TESTLIB_EXPORT
bool qCompare(
float const &
t1,
float const &
t2,
471 Q_TESTLIB_EXPORT
bool qCompare(
double const &
t1,
double const &
t2,
477#if QT_POINTER_SIZE == 8
482 Q_TESTLIB_EXPORT
bool qCompare(
unsigned t1,
unsigned t2,
const char *actual,
const char *
expected,
486 const char *actual,
const char *
expected,
489 const char *actual,
const char *
expected,
492 const char *actual,
const char *
expected,
495 const char *actual,
const char *
expected,
501 const char *actual,
const char *
expected,
507 const char *actual,
const char *
expected,
532 return compare_helper(
t1 ==
nullptr,
"Compared QObject pointers are not the same",
540 return compare_helper(
nullptr ==
t2,
"Compared QObject pointers are not the same",
564 Q_TESTLIB_EXPORT
char *
formatString(
const char *prefix,
const char *suffix,
size_t numArguments, ...);
585 template <
typename T1,
typename T2 = T1>
594 inline bool qCompare(
double const &
t1,
float const &
t2,
const char *actual,
600 inline bool qCompare(
float const &
t1,
double const &
t2,
const char *actual,
606 template <
typename T>
612 template <
typename T>
619 template <
typename T>
625 template <
typename T>
632 template <
typename T1,
typename T2>
638 template <
typename T1,
typename T2>
645 inline bool qCompare(
const char *
t1,
const char *
t2,
const char *actual,
671 inline bool qTest(
const T& actual,
const char *elementName,
const char *actualStr,
680 const char *lhsExpr,
const char *rhsExpr,
684#undef QTEST_COMPARE_DECL
686#define QWARN(msg) QTest::qWarn(static_cast<const char *>(msg), __FILE__, __LINE__)
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
static QByteArray number(int, int base=10)
Returns a byte-array representing the whole number n as text.
\inmodule QtCore \reentrant
\macro QT_RESTRICTED_CAST_FROM_ASCII
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
QList< QVariant > arguments
Combined button and popup list for selecting options.
const char * toString(QSizePolicy::Policy p)
Q_TESTLIB_EXPORT QString formatTryTimeoutDebugMessage(q_no_char8_t::QUtf8StringView expr, int timeout, int actual)
bool qTest(const T &actual, const char *elementName, const char *actualStr, const char *expected, const char *file, int line)
Q_TESTLIB_EXPORT int qRun()
Q_TESTLIB_EXPORT bool currentTestResolved()
Q_TESTLIB_EXPORT QTestData & newRow(const char *dataTag)
Appends a new row to the current test data.
Q_TESTLIB_EXPORT bool qVerify(bool statement, const char *statementStr, const char *description, const char *file, int line)
Q_TESTLIB_EXPORT const char * currentTestFunction()
Returns the name of the test function that is currently executed.
Q_TESTLIB_EXPORT QObject * testObject()
Q_TESTLIB_EXPORT char keyToAscii(Qt::Key key)
Q_TESTLIB_EXPORT bool runningTest()
Q_TESTLIB_EXPORT void setMainSourcePath(const char *file, const char *builddir=nullptr)
Q_TESTLIB_EXPORT void * qElementData(const char *elementName, int metaTypeId)
Q_TESTLIB_EXPORT Qt::Key asciiToKey(char ascii)
Q_TESTLIB_EXPORT bool qExpectFail(const char *dataIndex, const char *comment, TestFailMode mode, const char *file, int line)
char * toString(const MyPoint &point)
Q_TESTLIB_EXPORT bool compare_helper(bool success, const char *failureMsg, qxp::function_ref< const char *()> actualVal, qxp::function_ref< const char *()> expectedVal, const char *actual, const char *expected, const char *file, int line)
Q_TESTLIB_EXPORT void * qData(const char *tagName, int typeId)
Q_TESTLIB_EXPORT bool currentTestFailed()
Returns true if the current test function has failed, otherwise false.
Q_TESTLIB_EXPORT void qInit(QObject *testObject, int argc=0, char **argv=nullptr)
char * formatString(const char *prefix, const char *suffix, size_t numArguments,...)
char * toPrettyCString(const char *p, qsizetype length)
char * toHexRepresentation(const char *ba, qsizetype length)
Returns a pointer to a string that is the string ba represented as a space-separated sequence of hex ...
Q_TESTLIB_EXPORT bool compare_string_helper(const char *t1, const char *t2, const char *actual, const char *expected, const char *file, int line)
Q_DECL_COLD_FUNCTION Q_TESTLIB_EXPORT void qCaught(const char *expected, const char *what, const char *file, int line)
Q_TESTLIB_EXPORT QString qFindTestData(const char *basepath, const char *file=nullptr, int line=0, const char *builddir=nullptr, const char *sourcedir=nullptr)
Q_TESTLIB_EXPORT void ignoreMessage(QtMsgType type, const char *message)
Ignores messages created by qDebug(), qInfo() or qWarning().
bool reportResult(bool success, qxp::function_ref< const char *()> lhs, qxp::function_ref< const char *()> rhs, const char *lhsExpr, const char *rhsExpr, ComparisonOperation op, const char *file, int line)
bool compare_ptr_helper(const volatile void *t1, const volatile void *t2, const char *actual, const char *expected, const char *file, int line)
Q_TESTLIB_EXPORT void failOnWarning(const char *message)
Q_TESTLIB_EXPORT void qSkip(const char *message, const char *file, int line)
bool qCompare(QString const &t1, QLatin1StringView const &t2, const char *actual, const char *expected, const char *file, int line)
void addColumn(const char *name, T *=nullptr)
Adds a column with type {T} to the current test data.
char * toPrettyUnicode(QStringView string)
Q_TESTLIB_EXPORT const char * currentDataTag()
Returns the name of the current test data.
Q_TESTLIB_EXPORT int qExec(QObject *testObject, int argc=0, char **argv=nullptr)
Executes tests declared in testObject.
Q_TESTLIB_EXPORT QTestData & addRow(const char *format,...) Q_ATTRIBUTE_FORMAT_PRINTF(1
Q_TESTLIB_EXPORT void qCleanup()
Q_TESTLIB_EXPORT void addColumnInternal(int id, const char *name)
Q_DECL_COLD_FUNCTION Q_TESTLIB_EXPORT void qFail(const char *message, const char *file, int line)
Q_TESTLIB_EXPORT void * qGlobalData(const char *tagName, int typeId)
Q_TESTLIB_EXPORT const char * currentAppName()
Returns the name of the binary that is currently executed.
Q_CORE_EXPORT int qsnprintf(char *str, size_t n, const char *fmt,...)
Q_CORE_EXPORT char * qstrdup(const char *)
#define Q_ATTRIBUTE_FORMAT_PRINTF(A, B)
#define Q_DECL_COLD_FUNCTION
std::pair< T1, T2 > QPair
GLenum GLuint GLenum GLsizei length
GLbitfield GLuint64 timeout
[4]
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
[4]
GLuint GLsizei const GLchar * message
GLint GLsizei GLsizei GLenum format
#define QT_DEPRECATED_VERSION_X_6_3(text)
#define QT_DEPRECATED_VERSION_X_6_4(text)
#define QTEST_COMPARE_DECL(KLASS)
unsigned long long quint64