diff options
Diffstat (limited to 'src/testlib')
27 files changed, 162 insertions, 172 deletions
diff --git a/src/testlib/configure.json b/src/testlib/configure.json index df6132cdc2..726f614ee5 100644 --- a/src/testlib/configure.json +++ b/src/testlib/configure.json @@ -16,6 +16,12 @@ "purpose": "Provides a utility to test item models.", "condition": "features.itemmodel", "output": [ "publicFeature" ] + }, + "valgrind": { + "label": "Valgrind", + "purpose": "Profiling support with callgrind.", + "condition": "(config.linux || config.darwin) && features.process && features.regularexpression", + "output": [ "publicFeature" ] } }, diff --git a/src/testlib/qabstracttestlogger_p.h b/src/testlib/qabstracttestlogger_p.h index a64e7ea96f..9bb1d1e80c 100644 --- a/src/testlib/qabstracttestlogger_p.h +++ b/src/testlib/qabstracttestlogger_p.h @@ -97,14 +97,14 @@ public: virtual void enterTestData(QTestData *) {} virtual void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0) = 0; + const char *file = nullptr, int line = 0) = 0; virtual void addBenchmarkResult(const QBenchmarkResult &result) = 0; virtual void addMessage(QtMsgType, const QMessageLogContext &, const QString &); virtual void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0) = 0; + const char *file = nullptr, int line = 0) = 0; void outputString(const char *msg); @@ -151,7 +151,7 @@ struct QTestCharBuffer inline bool reset(int newSize) { - char *newBuf = 0; + char *newBuf = nullptr; if (buf == staticBuf) { // if we point to our internal buffer, we need to malloc first newBuf = reinterpret_cast<char *>(malloc(newSize)); diff --git a/src/testlib/qbenchmark.cpp b/src/testlib/qbenchmark.cpp index d49d07bb70..8d5543a0fc 100644 --- a/src/testlib/qbenchmark.cpp +++ b/src/testlib/qbenchmark.cpp @@ -82,7 +82,7 @@ QBenchmarkMeasurerBase * QBenchmarkGlobalData::createMeasurer() { QBenchmarkMeasurerBase *measurer = 0; if (0) { -#ifdef QTESTLIB_USE_VALGRIND +#if QT_CONFIG(valgrind) } else if (mode_ == CallgrindChildProcess || mode_ == CallgrindParentProcess) { measurer = new QBenchmarkCallgrindMeasurer; #endif diff --git a/src/testlib/qbenchmark_p.h b/src/testlib/qbenchmark_p.h index 3fa9c5f534..49868ac23a 100644 --- a/src/testlib/qbenchmark_p.h +++ b/src/testlib/qbenchmark_p.h @@ -55,12 +55,6 @@ #include <QtCore/qglobal.h> -#if (defined(Q_OS_LINUX) || defined Q_OS_MACOS) && QT_CONFIG(process) -#define QTESTLIB_USE_VALGRIND -#else -#undef QTESTLIB_USE_VALGRIND -#endif - #if defined(Q_OS_LINUX) && !defined(QT_LINUXBASE) && !defined(Q_OS_ANDROID) #define QTESTLIB_USE_PERF_EVENTS #else @@ -70,7 +64,7 @@ #include <QtTest/private/qbenchmarkmeasurement_p.h> #include <QtCore/QMap> #include <QtTest/qttestglobal.h> -#ifdef QTESTLIB_USE_VALGRIND +#if QT_CONFIG(valgrind) #include <QtTest/private/qbenchmarkvalgrind_p.h> #endif #ifdef QTESTLIB_USE_PERF_EVENTS diff --git a/src/testlib/qbenchmarkevent.cpp b/src/testlib/qbenchmarkevent.cpp index f696f8b1eb..a8270219e4 100644 --- a/src/testlib/qbenchmarkevent.cpp +++ b/src/testlib/qbenchmarkevent.cpp @@ -96,7 +96,11 @@ QTest::QBenchmarkMetric QBenchmarkEvent::metricType() } // This could be done in a much better way, this is just the beginning. +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) +bool QBenchmarkEvent::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) +#else bool QBenchmarkEvent::nativeEventFilter(const QByteArray &eventType, void *message, long *result) +#endif { Q_UNUSED(eventType); Q_UNUSED(message); diff --git a/src/testlib/qbenchmarkevent_p.h b/src/testlib/qbenchmarkevent_p.h index af42a17141..0f47aa475c 100644 --- a/src/testlib/qbenchmarkevent_p.h +++ b/src/testlib/qbenchmarkevent_p.h @@ -71,7 +71,11 @@ public: int adjustMedianCount(int suggestion) override; bool repeatCount() override { return 1; } QTest::QBenchmarkMetric metricType() override; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override; +#else bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override; +#endif qint64 eventCounter; }; diff --git a/src/testlib/qbenchmarkvalgrind.cpp b/src/testlib/qbenchmarkvalgrind.cpp index 7d24eb8293..0dac804338 100644 --- a/src/testlib/qbenchmarkvalgrind.cpp +++ b/src/testlib/qbenchmarkvalgrind.cpp @@ -39,8 +39,6 @@ #include <QtTest/private/qbenchmark_p.h> -#ifdef QTESTLIB_USE_VALGRIND - #include <QtTest/private/qbenchmarkvalgrind_p.h> #include <QtCore/qstringlist.h> #include <QtCore/qcoreapplication.h> @@ -243,5 +241,3 @@ QTest::QBenchmarkMetric QBenchmarkCallgrindMeasurer::metricType() } QT_END_NAMESPACE - -#endif // QTESTLIB_USE_VALGRIND diff --git a/src/testlib/qbenchmarkvalgrind_p.h b/src/testlib/qbenchmarkvalgrind_p.h index 69219b9a65..0619be9f22 100644 --- a/src/testlib/qbenchmarkvalgrind_p.h +++ b/src/testlib/qbenchmarkvalgrind_p.h @@ -58,6 +58,8 @@ class QStringList; +QT_REQUIRE_CONFIG(valgrind); + QT_BEGIN_NAMESPACE class QBenchmarkValgrindUtils diff --git a/src/testlib/qcsvbenchmarklogger_p.h b/src/testlib/qcsvbenchmarklogger_p.h index 5840aee0f5..83e465c859 100644 --- a/src/testlib/qcsvbenchmarklogger_p.h +++ b/src/testlib/qcsvbenchmarklogger_p.h @@ -68,11 +68,11 @@ public: void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; void addBenchmarkResult(const QBenchmarkResult &result) override; void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; }; QT_END_NAMESPACE diff --git a/src/testlib/qplaintestlogger_p.h b/src/testlib/qplaintestlogger_p.h index 55755830b2..80ef4864c1 100644 --- a/src/testlib/qplaintestlogger_p.h +++ b/src/testlib/qplaintestlogger_p.h @@ -68,17 +68,17 @@ public: void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; void addBenchmarkResult(const QBenchmarkResult &result) override; void addMessage(QtMsgType, const QMessageLogContext &, const QString &) override; void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; private: - void printMessage(const char *type, const char *msg, const char *file = 0, int line = 0); + void printMessage(const char *type, const char *msg, const char *file = nullptr, int line = 0); void outputMessage(const char *str); void printBenchmarkResult(const QBenchmarkResult &result); }; diff --git a/src/testlib/qsignaldumper.cpp b/src/testlib/qsignaldumper.cpp index 8305c5d424..d0b6d0dd3f 100644 --- a/src/testlib/qsignaldumper.cpp +++ b/src/testlib/qsignaldumper.cpp @@ -87,7 +87,7 @@ static void qSignalDumperCallback(QObject *caller, int signal_index, void **argv str += objname.toLocal8Bit(); if (!objname.isEmpty()) str += ' '; - str += QByteArray::number(quintptr(caller), 16); + str += QByteArray::number(quintptr(caller), 16).rightJustified(8, '0'); str += ") "; str += member.name(); @@ -105,7 +105,7 @@ static void qSignalDumperCallback(QObject *caller, int signal_index, void **argv str += '@'; quintptr addr = quintptr(*reinterpret_cast<void **>(argv[i + 1])); - str.append(QByteArray::number(addr, 16)); + str.append(QByteArray::number(addr, 16).rightJustified(8, '0')); } else if (typeId != QMetaType::UnknownType) { Q_ASSERT(typeId != QMetaType::Void); // void parameter => metaobject is corrupt str.append(arg) @@ -144,7 +144,7 @@ static void qSignalDumperCallbackSlot(QObject *caller, int method_index, void ** str += objname.toLocal8Bit(); if (!objname.isEmpty()) str += ' '; - str += QByteArray::number(quintptr(caller), 16); + str += QByteArray::number(quintptr(caller), 16).rightJustified(8, '0'); str += ") "; str += member.methodSignature(); @@ -170,13 +170,12 @@ void QSignalDumper::startDump() { static QSignalSpyCallbackSet set = { QTest::qSignalDumperCallback, QTest::qSignalDumperCallbackSlot, QTest::qSignalDumperCallbackEndSignal, 0 }; - qt_register_signal_spy_callbacks(set); + qt_register_signal_spy_callbacks(&set); } void QSignalDumper::endDump() { - static QSignalSpyCallbackSet nset = { 0, 0, 0 ,0 }; - qt_register_signal_spy_callbacks(nset); + qt_register_signal_spy_callbacks(nullptr); } void QSignalDumper::ignoreClass(const QByteArray &klass) diff --git a/src/testlib/qsignalspy.h b/src/testlib/qsignalspy.h index 218a26ec5c..0285080662 100644 --- a/src/testlib/qsignalspy.h +++ b/src/testlib/qsignalspy.h @@ -122,7 +122,7 @@ public: } if (!QMetaObject::connect(obj, sigIndex, this, memberOffset, - Qt::DirectConnection, 0)) { + Qt::DirectConnection, nullptr)) { qWarning("QSignalSpy: QMetaObject::connect returned false. Unable to connect."); return; } diff --git a/src/testlib/qtaptestlogger.cpp b/src/testlib/qtaptestlogger.cpp index 540b36e273..476761e602 100644 --- a/src/testlib/qtaptestlogger.cpp +++ b/src/testlib/qtaptestlogger.cpp @@ -154,10 +154,10 @@ void QTapTestLogger::addIncident(IncidentTypes type, const char *description, // This is fragile, but unfortunately testlib doesn't plumb // the expected and actual values to the loggers (yet). static QRegularExpression verifyRegex( - QLatin1Literal("^'(?<actualexpression>.*)' returned (?<actual>\\w+).+\\((?<message>.*)\\)$")); + QLatin1String("^'(?<actualexpression>.*)' returned (?<actual>\\w+).+\\((?<message>.*)\\)$")); static QRegularExpression comparRegex( - QLatin1Literal("^(?<message>.*)\n" + QLatin1String("^(?<message>.*)\n" "\\s*Actual\\s+\\((?<actualexpression>.*)\\)\\s*: (?<actual>.*)\n" "\\s*Expected\\s+\\((?<expectedexpresssion>.*)\\)\\s*: (?<expected>.*)$")); @@ -168,22 +168,22 @@ void QTapTestLogger::addIncident(IncidentTypes type, const char *description, if (match.hasMatch()) { bool isVerify = match.regularExpression() == verifyRegex; - QString message = match.captured(QLatin1Literal("message")); + QString message = match.captured(QLatin1String("message")); QString expected; QString actual; if (isVerify) { - QString expression = QLatin1Literal(" (") - % match.captured(QLatin1Literal("actualexpression")) % QLatin1Char(')') ; - actual = match.captured(QLatin1Literal("actual")).toLower() % expression; - expected = (actual.startsWith(QLatin1Literal("true")) ? QLatin1Literal("false") : QLatin1Literal("true")) % expression; + QString expression = QLatin1String(" (") + % match.captured(QLatin1String("actualexpression")) % QLatin1Char(')') ; + actual = match.captured(QLatin1String("actual")).toLower() % expression; + expected = (actual.startsWith(QLatin1String("true")) ? QLatin1String("false") : QLatin1String("true")) % expression; if (message.isEmpty()) - message = QLatin1Literal("Verification failed"); + message = QLatin1String("Verification failed"); } else { - expected = match.captured(QLatin1Literal("expected")) - % QLatin1Literal(" (") % match.captured(QLatin1Literal("expectedexpresssion")) % QLatin1Char(')'); - actual = match.captured(QLatin1Literal("actual")) - % QLatin1Literal(" (") % match.captured(QLatin1Literal("actualexpression")) % QLatin1Char(')'); + expected = match.captured(QLatin1String("expected")) + % QLatin1String(" (") % match.captured(QLatin1String("expectedexpresssion")) % QLatin1Char(')'); + actual = match.captured(QLatin1String("actual")) + % QLatin1String(" (") % match.captured(QLatin1String("actualexpression")) % QLatin1Char(')'); } QTestCharBuffer diagnosticsYamlish; diff --git a/src/testlib/qtaptestlogger_p.h b/src/testlib/qtaptestlogger_p.h index b51343e4fe..967c724b51 100644 --- a/src/testlib/qtaptestlogger_p.h +++ b/src/testlib/qtaptestlogger_p.h @@ -70,9 +70,9 @@ public: void enterTestData(QTestData *data) override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; void addBenchmarkResult(const QBenchmarkResult &) override {}; private: diff --git a/src/testlib/qteamcitylogger.cpp b/src/testlib/qteamcitylogger.cpp index 577c8e70cd..88c83d1269 100644 --- a/src/testlib/qteamcitylogger.cpp +++ b/src/testlib/qteamcitylogger.cpp @@ -251,7 +251,7 @@ QString QTeamCityLogger::tcEscapedString(const QString &str) const } } - return qMove(formattedString).simplified(); + return std::move(formattedString).simplified(); } QString QTeamCityLogger::escapedTestFuncName() const diff --git a/src/testlib/qteamcitylogger_p.h b/src/testlib/qteamcitylogger_p.h index 80f2454724..dd7c0cdcf0 100644 --- a/src/testlib/qteamcitylogger_p.h +++ b/src/testlib/qteamcitylogger_p.h @@ -70,11 +70,11 @@ public: void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; void addBenchmarkResult(const QBenchmarkResult &result) override; void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; private: QString currTestFuncName; diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h index ebd94939ce..89abc616d9 100644 --- a/src/testlib/qtest.h +++ b/src/testlib/qtest.h @@ -424,48 +424,45 @@ int main(int argc, char *argv[]) \ # define QTEST_DISABLE_KEYPAD_NAVIGATION #endif -#define QTEST_MAIN(TestObject) \ -int main(int argc, char *argv[]) \ -{ \ +#define QTEST_MAIN_IMPL(TestObject) \ TESTLIB_SELFCOVERAGE_START(#TestObject) \ QApplication app(argc, argv); \ app.setAttribute(Qt::AA_Use96Dpi, true); \ QTEST_DISABLE_KEYPAD_NAVIGATION \ TestObject tc; \ QTEST_SET_MAIN_SOURCE_PATH \ - return QTest::qExec(&tc, argc, argv); \ -} + return QTest::qExec(&tc, argc, argv); #elif defined(QT_GUI_LIB) #include <QtTest/qtest_gui.h> -#define QTEST_MAIN(TestObject) \ -int main(int argc, char *argv[]) \ -{ \ +#define QTEST_MAIN_IMPL(TestObject) \ TESTLIB_SELFCOVERAGE_START(#TestObject) \ QGuiApplication app(argc, argv); \ app.setAttribute(Qt::AA_Use96Dpi, true); \ TestObject tc; \ QTEST_SET_MAIN_SOURCE_PATH \ - return QTest::qExec(&tc, argc, argv); \ -} + return QTest::qExec(&tc, argc, argv); #else -#define QTEST_MAIN(TestObject) \ -int main(int argc, char *argv[]) \ -{ \ +#define QTEST_MAIN_IMPL(TestObject) \ TESTLIB_SELFCOVERAGE_START(#TestObject) \ QCoreApplication app(argc, argv); \ app.setAttribute(Qt::AA_Use96Dpi, true); \ TestObject tc; \ QTEST_SET_MAIN_SOURCE_PATH \ - return QTest::qExec(&tc, argc, argv); \ -} + return QTest::qExec(&tc, argc, argv); #endif // QT_GUI_LIB +#define QTEST_MAIN(TestObject) \ +int main(int argc, char *argv[]) \ +{ \ + QTEST_MAIN_IMPL(TestObject) \ +} + #define QTEST_GUILESS_MAIN(TestObject) \ int main(int argc, char *argv[]) \ { \ diff --git a/src/testlib/qtestaccessible.h b/src/testlib/qtestaccessible.h index d14dcec031..bd77ee77a1 100644 --- a/src/testlib/qtestaccessible.h +++ b/src/testlib/qtestaccessible.h @@ -65,7 +65,7 @@ QT_BEGIN_NAMESPACE class QObject; // Use pointers since we subclass QAccessibleEvent -typedef QList<QAccessibleEvent*> EventList; +using EventList = QList<QAccessibleEvent*>; bool operator==(const QAccessibleEvent &l, const QAccessibleEvent &r) { diff --git a/src/testlib/qtestcase.cpp b/src/testlib/qtestcase.cpp index 1f69429053..10477238cb 100644 --- a/src/testlib/qtestcase.cpp +++ b/src/testlib/qtestcase.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -301,7 +301,7 @@ class TestMethods { public: Q_DISABLE_COPY_MOVE(TestMethods) - typedef std::vector<QMetaMethod> MetaMethods; + using MetaMethods = std::vector<QMetaMethod>; explicit TestMethods(const QObject *o, const MetaMethods &m = MetaMethods()); @@ -574,7 +574,7 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, const char *const argv[], bool " -nocrashhandler : Disables the crash handler. Useful for debugging crashes.\n" "\n" " Benchmarking options:\n" -#ifdef QTESTLIB_USE_VALGRIND +#if QT_CONFIG(valgrind) " -callgrind : Use callgrind to time benchmarks\n" #endif #ifdef QTESTLIB_USE_PERF_EVENTS @@ -717,7 +717,7 @@ Q_TESTLIB_EXPORT void qtest_qParseArgs(int argc, const char *const argv[], bool } } else if (strcmp(argv[i], "-nocrashhandler") == 0) { QTest::noCrashHandler = true; -#ifdef QTESTLIB_USE_VALGRIND +#if QT_CONFIG(valgrind) } else if (strcmp(argv[i], "-callgrind") == 0) { if (QBenchmarkValgrindUtils::haveValgrind()) if (QFileInfo(QDir::currentPath()).isWritable()) { @@ -1012,14 +1012,14 @@ public: WatchDog() { QMutexLocker locker(&mutex); - timeout.store(-1); + timeout.storeRelaxed(-1); start(); waitCondition.wait(&mutex); } ~WatchDog() { { QMutexLocker locker(&mutex); - timeout.store(0); + timeout.storeRelaxed(0); waitCondition.wakeAll(); } wait(); @@ -1027,13 +1027,13 @@ public: void beginTest() { QMutexLocker locker(&mutex); - timeout.store(defaultTimeout()); + timeout.storeRelaxed(defaultTimeout()); waitCondition.wakeAll(); } void testFinished() { QMutexLocker locker(&mutex); - timeout.store(-1); + timeout.storeRelaxed(-1); waitCondition.wakeAll(); } @@ -1041,7 +1041,7 @@ public: QMutexLocker locker(&mutex); waitCondition.wakeAll(); while (1) { - int t = timeout.load(); + int t = timeout.loadRelaxed(); if (!t) break; if (Q_UNLIKELY(!waitCondition.wait(&mutex, t))) { @@ -1095,7 +1095,7 @@ bool TestMethods::invokeTest(int index, const char *data, WatchDog *watchDog) co const int globalDataCount = gTable->dataCount(); int curGlobalDataIndex = 0; - /* For each test function that has a *_data() table/function, do: */ + /* For each entry in the global data table, do: */ do { if (!gTable->isEmpty()) QTestResult::setCurrentGlobalTestData(gTable->testData(curGlobalDataIndex)); @@ -1103,50 +1103,50 @@ bool TestMethods::invokeTest(int index, const char *data, WatchDog *watchDog) co if (curGlobalDataIndex == 0) { qsnprintf(member, 512, "%s_data()", name.constData()); invokeMethod(QTest::currentTestObject, member); + if (QTestResult::skipCurrentTest()) + break; } bool foundFunction = false; - if (!QTestResult::skipCurrentTest()) { - int curDataIndex = 0; - const int dataCount = table.dataCount(); - - // Data tag requested but none available? - if (data && !dataCount) { - // Let empty data tag through. - if (!*data) - data = 0; - else { - fprintf(stderr, "Unknown testdata for function %s(): '%s'\n", name.constData(), data); - fprintf(stderr, "Function has no testdata.\n"); - return false; - } + int curDataIndex = 0; + const int dataCount = table.dataCount(); + + // Data tag requested but none available? + if (data && !dataCount) { + // Let empty data tag through. + if (!*data) + data = 0; + else { + fprintf(stderr, "Unknown testdata for function %s(): '%s'\n", name.constData(), data); + fprintf(stderr, "Function has no testdata.\n"); + return false; } + } - /* For each entry in the data table, do: */ - do { - QTestResult::setSkipCurrentTest(false); - QTestResult::setBlacklistCurrentTest(false); - if (!data || !qstrcmp(data, table.testData(curDataIndex)->dataTag())) { - foundFunction = true; + /* For each entry in this test's data table, do: */ + do { + QTestResult::setSkipCurrentTest(false); + QTestResult::setBlacklistCurrentTest(false); + if (!data || !qstrcmp(data, table.testData(curDataIndex)->dataTag())) { + foundFunction = true; - QTestPrivate::checkBlackLists(name.constData(), dataCount ? table.testData(curDataIndex)->dataTag() : 0); + QTestPrivate::checkBlackLists(name.constData(), dataCount ? table.testData(curDataIndex)->dataTag() : 0); - QTestDataSetter s(curDataIndex >= dataCount ? static_cast<QTestData *>(0) - : table.testData(curDataIndex)); + QTestDataSetter s(curDataIndex >= dataCount ? static_cast<QTestData *>(0) + : table.testData(curDataIndex)); - QTestPrivate::qtestMouseButtons = Qt::NoButton; - if (watchDog) - watchDog->beginTest(); - invokeTestOnData(index); - if (watchDog) - watchDog->testFinished(); + QTestPrivate::qtestMouseButtons = Qt::NoButton; + if (watchDog) + watchDog->beginTest(); + invokeTestOnData(index); + if (watchDog) + watchDog->testFinished(); - if (data) - break; - } - ++curDataIndex; - } while (curDataIndex < dataCount); - } + if (data) + break; + } + ++curDataIndex; + } while (curDataIndex < dataCount); if (data && !foundFunction) { fprintf(stderr, "Unknown testdata for function %s: '%s()'\n", name.constData(), data); @@ -1459,7 +1459,7 @@ void TestMethods::invokeTests(QObject *testObject) const QScopedPointer<WatchDog> watchDog; if (!debuggerPresent() -#ifdef QTESTLIB_USE_VALGRIND +#if QT_CONFIG(valgrind) && QBenchmarkGlobalData::current->mode() != QBenchmarkGlobalData::CallgrindChildProcess #endif ) { @@ -1866,7 +1866,7 @@ int QTest::qRun() { QTEST_ASSERT(currentTestObject); -#ifdef QTESTLIB_USE_VALGRIND +#if QT_CONFIG(valgrind) int callgrindChildExitCode = 0; #endif @@ -1886,7 +1886,7 @@ int QTest::qRun() } // !noCrashHandler #endif // Q_OS_WIN -#ifdef QTESTLIB_USE_VALGRIND +#if QT_CONFIG(valgrind) if (QBenchmarkGlobalData::current->mode() == QBenchmarkGlobalData::CallgrindParentProcess) { if (Q_UNLIKELY(!qApp)) qFatal("QtTest: -callgrind option is not available with QTEST_APPLESS_MAIN"); @@ -1944,7 +1944,7 @@ int QTest::qRun() } #endif -#ifdef QTESTLIB_USE_VALGRIND +#if QT_CONFIG(valgrind) if (QBenchmarkGlobalData::current->mode() == QBenchmarkGlobalData::CallgrindParentProcess) return callgrindChildExitCode; #endif @@ -2148,7 +2148,7 @@ QSharedPointer<QTemporaryDir> QTest::qExtractTestData(const QString &dirName) } } - result = qMove(tempDir); + result = std::move(tempDir); return result; } @@ -2519,13 +2519,28 @@ bool QTest::compare_helper(bool success, const char *failureMsg, return QTestResult::compare(success, failureMsg, val1, val2, actual, expected, file, line); } +template <typename T> +static bool floatingCompare(const T &t1, const T &t2) +{ + switch (qFpClassify(t1)) + { + case FP_INFINITE: + return (t1 < 0) == (t2 < 0) && qFpClassify(t2) == FP_INFINITE; + case FP_NAN: + return qFpClassify(t2) == FP_NAN; + default: + return qFuzzyCompare(t1, t2); + } +} + /*! \fn bool QTest::qCompare(const qfloat16 &t1, const qfloat16 &t2, const char *actual, const char *expected, const char *file, int line) \internal */ bool QTest::qCompare(qfloat16 const &t1, qfloat16 const &t2, const char *actual, const char *expected, const char *file, int line) { - return compare_helper(qFuzzyCompare(t1, t2), "Compared qfloat16s are not the same (fuzzy compare)", + return compare_helper(floatingCompare(t1, t2), + "Compared qfloat16s are not the same (fuzzy compare)", toString(t1), toString(t2), actual, expected, file, line); } @@ -2535,16 +2550,8 @@ bool QTest::qCompare(qfloat16 const &t1, qfloat16 const &t2, const char *actual, bool QTest::qCompare(float const &t1, float const &t2, const char *actual, const char *expected, const char *file, int line) { - bool equal = false; - int cl1 = std::fpclassify(t1); - int cl2 = std::fpclassify(t2); - if (cl1 == FP_INFINITE) - equal = ((t1 < 0) == (t2 < 0)) && cl2 == FP_INFINITE; - else if (cl1 == FP_NAN) - equal = (cl2 == FP_NAN); - else - equal = qFuzzyCompare(t1, t2); - return compare_helper(equal, "Compared floats are not the same (fuzzy compare)", + return compare_helper(floatingCompare(t1, t2), + "Compared floats are not the same (fuzzy compare)", toString(t1), toString(t2), actual, expected, file, line); } @@ -2554,16 +2561,8 @@ bool QTest::qCompare(float const &t1, float const &t2, const char *actual, const bool QTest::qCompare(double const &t1, double const &t2, const char *actual, const char *expected, const char *file, int line) { - bool equal = false; - int cl1 = std::fpclassify(t1); - int cl2 = std::fpclassify(t2); - if (cl1 == FP_INFINITE) - equal = ((t1 < 0) == (t2 < 0)) && cl2 == FP_INFINITE; - else if (cl1 == FP_NAN) - equal = (cl2 == FP_NAN); - else - equal = qFuzzyCompare(t1, t2); - return compare_helper(equal, "Compared doubles are not the same (fuzzy compare)", + return compare_helper(floatingCompare(t1, t2), + "Compared doubles are not the same (fuzzy compare)", toString(t1), toString(t2), actual, expected, file, line); } @@ -2633,7 +2632,7 @@ static void massageExponent(char *text) template <> Q_TESTLIB_EXPORT char *QTest::toString<TYPE>(const TYPE &t) \ { \ char *msg = new char[128]; \ - switch (std::fpclassify(t)) { \ + switch (qFpClassify(t)) { \ case FP_INFINITE: \ qstrncpy(msg, (t < 0 ? "-inf" : "inf"), 128); \ break; \ @@ -2641,22 +2640,16 @@ template <> Q_TESTLIB_EXPORT char *QTest::toString<TYPE>(const TYPE &t) \ qstrncpy(msg, "nan", 128); \ break; \ default: \ - qsnprintf(msg, 128, #FORMAT, t); \ + qsnprintf(msg, 128, #FORMAT, double(t)); \ massageExponent(msg); \ break; \ } \ return msg; \ } +TO_STRING_FLOAT(qfloat16, %.3g) TO_STRING_FLOAT(float, %g) -TO_STRING_FLOAT(double, %.12lg) - -template <> Q_TESTLIB_EXPORT char *QTest::toString<qfloat16>(const qfloat16 &t) -{ - char *msg = new char[16]; - qsnprintf(msg, 16, "%.3g", static_cast<float>(t)); - return msg; -} +TO_STRING_FLOAT(double, %.12g) template <> Q_TESTLIB_EXPORT char *QTest::toString<char>(const char &t) { diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index 5d566b835e..af7c0f43b9 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -189,16 +189,8 @@ do {\ return;\ } while (false) -#ifdef Q_COMPILER_VARIADIC_MACROS - #define QSKIP(statement, ...) QSKIP_INTERNAL(statement) -#else - -#define QSKIP(statement) QSKIP_INTERNAL(statement) - -#endif - #define QEXPECT_FAIL(dataIndex, comment, mode)\ do {\ if (!QTest::qExpectFail(dataIndex, static_cast<const char *>(comment), QTest::mode, __FILE__, __LINE__))\ @@ -344,7 +336,7 @@ namespace QTest template <typename T> inline void addColumn(const char *name, T * = nullptr) { - typedef std::is_same<T, const char*> QIsSameTConstChar; + using QIsSameTConstChar = std::is_same<T, const char*>; Q_STATIC_ASSERT_X(!QIsSameTConstChar::value, "const char* is not allowed as a test data format."); addColumnInternal(qMetaTypeId<T>(), name); } diff --git a/src/testlib/qtestcoreelement_p.h b/src/testlib/qtestcoreelement_p.h index e79efdd87f..84406fed85 100644 --- a/src/testlib/qtestcoreelement_p.h +++ b/src/testlib/qtestcoreelement_p.h @@ -80,7 +80,7 @@ class QTestCoreElement: public QTestCoreList<ElementType> template<class ElementType> QTestCoreElement<ElementType>::QTestCoreElement(int t) - :listOfAttributes(0), type(QTest::LogElementType(t)) + :listOfAttributes(nullptr), type(QTest::LogElementType(t)) { } @@ -114,7 +114,7 @@ const char *QTestCoreElement<ElementType>::attributeValue(QTest::AttributeIndex if (attrb) return attrb->value(); - return 0; + return nullptr; } template <class ElementType> @@ -124,7 +124,7 @@ const char *QTestCoreElement<ElementType>::attributeName(QTest::AttributeIndex i if (attrb) return attrb->name(); - return 0; + return nullptr; } template <class ElementType> @@ -145,7 +145,7 @@ const char *QTestCoreElement<ElementType>::elementName() const if (type != QTest::LET_Undefined) return xmlElementNames[type]; - return 0; + return nullptr; } template <class ElementType> @@ -165,7 +165,7 @@ const QTestElementAttribute *QTestCoreElement<ElementType>::attribute(QTest::Att iterator = iterator->nextElement(); } - return 0; + return nullptr; } QT_END_NAMESPACE diff --git a/src/testlib/qtestcorelist_p.h b/src/testlib/qtestcorelist_p.h index 4d080f6758..daeb293644 100644 --- a/src/testlib/qtestcorelist_p.h +++ b/src/testlib/qtestcorelist_p.h @@ -73,8 +73,8 @@ class QTestCoreList template <class T> QTestCoreList<T>::QTestCoreList() - : next(0) - , prev(0) + : next(nullptr) + , prev(nullptr) { } @@ -82,12 +82,12 @@ template <class T> QTestCoreList<T>::~QTestCoreList() { if (prev) { - prev->next = 0; + prev->next = nullptr; } delete prev; if (next) { - next->prev = 0; + next->prev = nullptr; } delete next; } diff --git a/src/testlib/qtestlog.cpp b/src/testlib/qtestlog.cpp index faef3912c4..14543c3cde 100644 --- a/src/testlib/qtestlog.cpp +++ b/src/testlib/qtestlog.cpp @@ -219,7 +219,7 @@ namespace QTest { } if (type != QtFatalMsg) { - if (counter.load() <= 0) + if (counter.loadRelaxed() <= 0) return; if (!counter.deref()) { diff --git a/src/testlib/qtesttable.cpp b/src/testlib/qtesttable.cpp index 8d42668a5b..20e0702d44 100644 --- a/src/testlib/qtesttable.cpp +++ b/src/testlib/qtesttable.cpp @@ -65,10 +65,10 @@ public: int type; }; - typedef std::vector<Element> ElementList; + using ElementList = std::vector<Element>; ElementList elementList; - typedef std::vector<QTestData *> DataList; + using DataList = std::vector<QTestData *>; DataList dataList; void addColumn(int elemType, const char *elemName) { elementList.push_back(Element(elemName, elemType)); } @@ -152,14 +152,12 @@ private: int QTestTable::indexOf(const char *elementName) const { - typedef QTestTablePrivate::ElementList::const_iterator It; - QTEST_ASSERT(elementName); const QTestTablePrivate::ElementList &elementList = d->elementList; - const It it = std::find_if(elementList.begin(), elementList.end(), - NamePredicate(elementName)); + const auto it = std::find_if(elementList.begin(), elementList.end(), + NamePredicate(elementName)); return it != elementList.end() ? int(it - elementList.begin()) : -1; } diff --git a/src/testlib/qxmltestlogger_p.h b/src/testlib/qxmltestlogger_p.h index b85742f939..04ed57d587 100644 --- a/src/testlib/qxmltestlogger_p.h +++ b/src/testlib/qxmltestlogger_p.h @@ -71,11 +71,11 @@ public: void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; void addBenchmarkResult(const QBenchmarkResult &result) override; void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; static int xmlCdata(QTestCharBuffer *dest, char const* src); static int xmlQuote(QTestCharBuffer *dest, char const* src); diff --git a/src/testlib/qxunittestlogger_p.h b/src/testlib/qxunittestlogger_p.h index 8fb01fbe61..48f07ddcf2 100644 --- a/src/testlib/qxunittestlogger_p.h +++ b/src/testlib/qxunittestlogger_p.h @@ -71,12 +71,12 @@ class QXunitTestLogger : public QAbstractTestLogger void leaveTestFunction() override; void addIncident(IncidentTypes type, const char *description, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; void addBenchmarkResult(const QBenchmarkResult &result) override; void addTag(QTestElement* element); void addMessage(MessageTypes type, const QString &message, - const char *file = 0, int line = 0) override; + const char *file = nullptr, int line = 0) override; private: QTestElement *listOfTestcases; diff --git a/src/testlib/testlib.pro b/src/testlib/testlib.pro index f52a913a08..530bc6b425 100644 --- a/src/testlib/testlib.pro +++ b/src/testlib/testlib.pro @@ -17,7 +17,6 @@ HEADERS = \ qbenchmark_p.h \ qbenchmarkmeasurement_p.h \ qbenchmarktimemeasurers_p.h \ - qbenchmarkvalgrind_p.h \ qbenchmarkevent_p.h \ qbenchmarkperfevents_p.h \ qbenchmarkmetric.h \ @@ -70,7 +69,6 @@ SOURCES = \ qabstracttestlogger.cpp \ qbenchmark.cpp \ qbenchmarkmeasurement.cpp \ - qbenchmarkvalgrind.cpp \ qbenchmarkevent.cpp \ qbenchmarkperfevents.cpp \ qbenchmarkmetric.cpp \ @@ -92,6 +90,13 @@ qtConfig(itemmodeltester) { qabstractitemmodeltester.cpp } +qtConfig(valgrind) { + HEADERS += \ + qbenchmarkvalgrind_p.h + SOURCES += \ + qbenchmarkvalgrind.cpp +} + DEFINES *= QT_NO_CAST_TO_ASCII \ QT_NO_CAST_FROM_ASCII \ QT_NO_FOREACH \ |