diff --git a/src/testlib/qtest_network.h b/src/testlib/qtest_network.h index 61f80a536c8..403a663ae2c 100644 --- a/src/testlib/qtest_network.h +++ b/src/testlib/qtest_network.h @@ -4,7 +4,7 @@ #ifndef QTEST_NETWORK_H #define QTEST_NETWORK_H -#include +#include // enable NETWORK features #ifndef QT_NETWORK_LIB @@ -43,6 +43,7 @@ inline char *toString(const QHostAddress &addr) return toString(addr.toString()); } +} // namespace QTest inline char *toString(QNetworkReply::NetworkError code) { @@ -57,7 +58,7 @@ inline char *toString(QNetworkReply::NetworkError code) inline char *toString(const QNetworkCookie &cookie) { - return toString(cookie.toRawForm()); + return QTest::toString(cookie.toRawForm()); } inline char *toString(const QList &list) @@ -69,11 +70,9 @@ inline char *toString(const QList &list) result.chop(2); // remove trailing ", " } result.append(')'); - return toString(result); + return QTest::toString(result); } -} // namespace QTest - QT_END_NAMESPACE #endif diff --git a/src/testlib/qtest_widgets.h b/src/testlib/qtest_widgets.h index 2b60d94fd7d..90ee3aa6aa4 100644 --- a/src/testlib/qtest_widgets.h +++ b/src/testlib/qtest_widgets.h @@ -62,15 +62,16 @@ inline QByteArray toString(QSizePolicy sp) } } // namespace Internal +} // namespace QTest inline char *toString(QSizePolicy::Policy p) { - return qstrdup(Internal::toString(p)); + return qstrdup(QTest::Internal::toString(p)); } inline char *toString(QSizePolicy::ControlTypes ct) { - return qstrdup(Internal::toString(ct).constData()); + return qstrdup(QTest::Internal::toString(ct).constData()); } inline char *toString(QSizePolicy::ControlType ct) @@ -80,11 +81,9 @@ inline char *toString(QSizePolicy::ControlType ct) inline char *toString(QSizePolicy sp) { - return qstrdup(Internal::toString(sp).constData()); + return qstrdup(QTest::Internal::toString(sp).constData()); } -} // namespace QTest - QT_END_NAMESPACE #endif diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index fb2b46d824b..75c36066af6 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -1745,14 +1745,33 @@ void TestMethods::invokeTests(QObject *testObject) const QSignalDumper::endDump(); } +#if QT_DEPRECATED_SINCE(6, 8) +static const char *functionRefFormatter(const void *f) +{ + auto formatter = static_cast *>(f); + return (*formatter)(); +}; + bool reportResult(bool success, qxp::function_ref lhs, qxp::function_ref rhs, const char *lhsExpr, const char *rhsExpr, ComparisonOperation op, const char *file, int line) { - return QTestResult::reportResult(success, lhs, rhs, lhsExpr, rhsExpr, op, file, line); + return QTestResult::reportResult(success, &lhs, &rhs, + functionRefFormatter, functionRefFormatter, + lhsExpr, rhsExpr, op, file, line); } +#endif // QT_DEPRECATED_SINCE(6, 8) +bool reportResult(bool success, const void *lhs, const void *rhs, + const char *(*lhsFormatter)(const void*), + const char *(*rhsFormatter)(const void*), + const char *lhsExpr, const char *rhsExpr, + ComparisonOperation op, const char *file, int line) +{ + return QTestResult::reportResult(success, lhs, rhs, lhsFormatter, rhsFormatter, + lhsExpr, rhsExpr, op, file, line); +} } // namespace QTest static void initEnvironment() @@ -2748,7 +2767,12 @@ bool QTest::compare_helper(bool success, const char *failureMsg, const char *actual, const char *expected, const char *file, int line) { - return QTestResult::reportResult(success, actualVal, expectedVal, actual, expected, + auto functionRefFormatter = [](const void *f) { + auto formatter = static_cast *>(f); + return (*formatter)(); + }; + return QTestResult::reportResult(success, &actualVal, &expectedVal, functionRefFormatter, + functionRefFormatter, actual, expected, QTest::ComparisonOperation::CustomCompare, file, line, failureMsg); } diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index 06fbd25c9c0..6df20f81219 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -95,8 +95,7 @@ do { \ return QTest::reportResult(std::forward(qt_lhs_arg) \ op \ std::forward(qt_rhs_arg), \ - [&qt_lhs_arg] { return QTest::toString(qt_lhs_arg); }, \ - [&qt_rhs_arg] { return QTest::toString(qt_rhs_arg); }, \ + qt_lhs_arg, qt_rhs_arg, \ #lhs, #rhs, QTest::ComparisonOperation::opId, \ __FILE__, __LINE__); \ }(lhs, rhs)) { \ @@ -330,6 +329,18 @@ namespace QTest Q_TESTLIB_EXPORT QString formatTryTimeoutDebugMessage(q_no_char8_t::QUtf8StringView expr, int timeout, int actual); + template const char *genericToString(const void *arg) + { + using QTest::toString; + return toString(*static_cast(arg)); + } + + template <> inline const char *genericToString(const void *arg) + { + using QTest::toString; + return toString(static_cast(arg)); + } + // Exported so Qt Quick Test can also use it for generating backtraces upon crashes. Q_TESTLIB_EXPORT extern bool noCrashHandler; @@ -644,10 +655,32 @@ namespace QTest qMetaTypeId())), actualStr, expected, file, line); } +#if QT_DEPRECATED_SINCE(6, 8) + QT_DEPRECATED_VERSION_X_6_8("use the overload without qxp::function_ref") Q_TESTLIB_EXPORT bool reportResult(bool success, qxp::function_ref lhs, qxp::function_ref rhs, const char *lhsExpr, const char *rhsExpr, ComparisonOperation op, const char *file, int line); +#endif // QT_DEPRECATED_SINCE(6, 8) + + Q_TESTLIB_EXPORT bool reportResult(bool success, const void *lhs, const void *rhs, + const char *(*lhsFormatter)(const void*), + const char *(*rhsFormatter)(const void*), + const char *lhsExpr, const char *rhsExpr, + ComparisonOperation op, const char *file, int line); + + template + inline bool reportResult(bool result, const T1 &lhs, const T2 &rhs, + const char *lhsExpr, const char *rhsExpr, + ComparisonOperation op, const char *file, int line) + { + using D1 = std::decay_t; + using D2 = std::decay_t; + using Internal::genericToString; + return reportResult(result, std::addressof(lhs), std::addressof(rhs), + genericToString, genericToString, + lhsExpr, rhsExpr, op, file, line); + } } diff --git a/src/testlib/qtestcase.qdoc b/src/testlib/qtestcase.qdoc index 973899e4d36..2eb060b9af6 100644 --- a/src/testlib/qtestcase.qdoc +++ b/src/testlib/qtestcase.qdoc @@ -1608,7 +1608,8 @@ */ /*! - \fn char *QTest::toString(QSizePolicy::ControlType ct) + \fn char *toString(QSizePolicy::ControlType ct) + \relates QTest \overload \since 5.5 @@ -1616,7 +1617,8 @@ */ /*! - \fn char *QTest::toString(QSizePolicy::ControlTypes cts) + \fn char *toString(QSizePolicy::ControlTypes cts) + \relates QTest \overload \since 5.5 @@ -1624,7 +1626,8 @@ */ /*! - \fn char *QTest::toString(QSizePolicy::Policy p) + \fn char *toString(QSizePolicy::Policy p) + \relates QTest \overload \since 5.5 @@ -1632,7 +1635,8 @@ */ /*! - \fn char *QTest::toString(QSizePolicy sp) + \fn char *toString(QSizePolicy sp) + \relates QTest \overload \since 5.5 diff --git a/src/testlib/qtestresult.cpp b/src/testlib/qtestresult.cpp index 093e9b58ef5..7c5ce9ce548 100644 --- a/src/testlib/qtestresult.cpp +++ b/src/testlib/qtestresult.cpp @@ -628,8 +628,9 @@ static const char *failureMessageForOp(QTest::ComparisonOperation op) Q_UNREACHABLE_RETURN(""); } -bool QTestResult::reportResult(bool success, qxp::function_ref lhs, - qxp::function_ref rhs, +bool QTestResult::reportResult(bool success, const void *lhs, const void *rhs, + const char *(*lhsFormatter)(const void*), + const char *(*rhsFormatter)(const void*), const char *lhsExpr, const char *rhsExpr, QTest::ComparisonOperation op, const char *file, int line, const char *failureMessage) @@ -653,8 +654,8 @@ bool QTestResult::reportResult(bool success, qxp::function_ref l return checkStatement(success, msg, file, line); } - const std::unique_ptr lhsPtr{ lhs() }; - const std::unique_ptr rhsPtr{ rhs() }; + const std::unique_ptr lhsPtr{ lhsFormatter(lhs) }; + const std::unique_ptr rhsPtr{ rhsFormatter(rhs) }; if (!failureMessage) failureMessage = failureMessageForOp(op); diff --git a/src/testlib/qtestresult_p.h b/src/testlib/qtestresult_p.h index 48c2c34611b..52607cc2eef 100644 --- a/src/testlib/qtestresult_p.h +++ b/src/testlib/qtestresult_p.h @@ -17,7 +17,6 @@ #include #include -#include #include QT_BEGIN_NAMESPACE @@ -102,8 +101,9 @@ public: static void setCurrentAppName(const char *appName); static const char *currentAppName(); - static bool reportResult(bool success, qxp::function_ref lhs, - qxp::function_ref rhs, + static bool reportResult(bool success, const void *lhs, const void *rhs, + const char *(*lhsFormatter)(const void*), + const char *(*rhsFormatter)(const void*), const char *lhsExpr, const char *rhsExpr, QTest::ComparisonOperation op, const char *file, int line, const char *failureMessage = nullptr); diff --git a/tests/auto/testlib/selftests/expected_testlib.junitxml b/tests/auto/testlib/selftests/expected_testlib.junitxml index f5d3a94126a..33c8bfe4035 100644 --- a/tests/auto/testlib/selftests/expected_testlib.junitxml +++ b/tests/auto/testlib/selftests/expected_testlib.junitxml @@ -9,7 +9,7 @@ + Expected (nullptr) : "nullptr"]]> diff --git a/tests/auto/testlib/selftests/expected_testlib.lightxml b/tests/auto/testlib/selftests/expected_testlib.lightxml index cd0f96d6d4e..76435eb9f0e 100644 --- a/tests/auto/testlib/selftests/expected_testlib.lightxml +++ b/tests/auto/testlib/selftests/expected_testlib.lightxml @@ -11,7 +11,7 @@ + Expected (nullptr) : "nullptr"]]> diff --git a/tests/auto/testlib/selftests/expected_testlib.tap b/tests/auto/testlib/selftests/expected_testlib.tap index 4a6056bc77d..1fa7dc77c44 100644 --- a/tests/auto/testlib/selftests/expected_testlib.tap +++ b/tests/auto/testlib/selftests/expected_testlib.tap @@ -5,9 +5,9 @@ not ok 2 - basics() --- type: QCOMPARE message: Compared QObject pointers are not the same - wanted: (nullptr) (nullptr) + wanted: "nullptr" (nullptr) found: tst_TestLib/"TestObject" (QTest::testObject()) - expected: (nullptr) (nullptr) + expected: "nullptr" (nullptr) actual: tst_TestLib/"TestObject" (QTest::testObject()) at: tst_TestLib::basics() (qtbase/tests/auto/testlib/selftests/testlib/tst_testlib.cpp:0) file: qtbase/tests/auto/testlib/selftests/testlib/tst_testlib.cpp diff --git a/tests/auto/testlib/selftests/expected_testlib.teamcity b/tests/auto/testlib/selftests/expected_testlib.teamcity index 279ef03f3f4..52f7fa244c3 100644 --- a/tests/auto/testlib/selftests/expected_testlib.teamcity +++ b/tests/auto/testlib/selftests/expected_testlib.teamcity @@ -2,7 +2,7 @@ ##teamcity[testStarted name='initTestCase()' flowId='tst_TestLib'] ##teamcity[testFinished name='initTestCase()' flowId='tst_TestLib'] ##teamcity[testStarted name='basics()' flowId='tst_TestLib'] -##teamcity[testFailed name='basics()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/testlib/tst_testlib.cpp(0)|]' details='Compared QObject pointers are not the same|n Actual (QTest::testObject()): tst_TestLib/"TestObject"|n Expected (nullptr) : (nullptr)' flowId='tst_TestLib'] +##teamcity[testFailed name='basics()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/testlib/tst_testlib.cpp(0)|]' details='Compared QObject pointers are not the same|n Actual (QTest::testObject()): tst_TestLib/"TestObject"|n Expected (nullptr) : "nullptr"' flowId='tst_TestLib'] ##teamcity[testFinished name='basics()' flowId='tst_TestLib'] ##teamcity[testStarted name='delays()' flowId='tst_TestLib'] ##teamcity[testFinished name='delays()' flowId='tst_TestLib'] diff --git a/tests/auto/testlib/selftests/expected_testlib.txt b/tests/auto/testlib/selftests/expected_testlib.txt index a0b8a275d09..4d652626e9b 100644 --- a/tests/auto/testlib/selftests/expected_testlib.txt +++ b/tests/auto/testlib/selftests/expected_testlib.txt @@ -3,7 +3,7 @@ Config: Using QtTest library PASS : tst_TestLib::initTestCase() FAIL! : tst_TestLib::basics() Compared QObject pointers are not the same Actual (QTest::testObject()): tst_TestLib/"TestObject" - Expected (nullptr) : (nullptr) + Expected (nullptr) : "nullptr" Loc: [qtbase/tests/auto/testlib/selftests/testlib/tst_testlib.cpp(0)] PASS : tst_TestLib::delays() PASS : tst_TestLib::reals(zero) diff --git a/tests/auto/testlib/selftests/expected_testlib.xml b/tests/auto/testlib/selftests/expected_testlib.xml index 241fd3f8d12..8b66b003d0d 100644 --- a/tests/auto/testlib/selftests/expected_testlib.xml +++ b/tests/auto/testlib/selftests/expected_testlib.xml @@ -13,7 +13,7 @@ + Expected (nullptr) : "nullptr"]]> diff --git a/tests/auto/testlib/selftests/extendedcompare/tst_extendedcompare.cpp b/tests/auto/testlib/selftests/extendedcompare/tst_extendedcompare.cpp index cc75e7f7fb3..70a77986678 100644 --- a/tests/auto/testlib/selftests/extendedcompare/tst_extendedcompare.cpp +++ b/tests/auto/testlib/selftests/extendedcompare/tst_extendedcompare.cpp @@ -93,11 +93,13 @@ static ClassWithPointerGetter getClassForValue(int val) // various toString() overloads namespace QTest { -char *toString(const int *val) +template <> char *toString(const int *const &val) { return val ? toString(*val) : toString(nullptr); } +} // namespace QTest + char *toString(const MyClass &val) { char *msg = new char[128]; @@ -117,8 +119,6 @@ char *toString(const MyClass *val) return toString(nullptr); } -} // namespace QTest - enum MyUnregisteredEnum { MyUnregisteredEnumValue1, MyUnregisteredEnumValue2 }; class tst_ExtendedCompare : public QObject @@ -293,8 +293,6 @@ public: } }; -namespace QTest { - char *toString(const ClassWithDeferredSetter &val) { char *msg = new char[128]; @@ -302,8 +300,6 @@ char *toString(const ClassWithDeferredSetter &val) return msg; } -} // namespace QTest - void tst_ExtendedCompare::checkComparisonWithTimeout() { QFETCH_GLOBAL(QTest::ComparisonOperation, operation);