diff options
author | Edward Welbourne <edward.welbourne@qt.io> | 2021-09-28 15:12:48 +0200 |
---|---|---|
committer | Edward Welbourne <edward.welbourne@qt.io> | 2021-12-09 20:54:25 +0100 |
commit | 37bc11e707d3f29fa81675bcc41610ab65c2b314 (patch) | |
tree | 8706fcaec5e287425fb70d047febe7ebaceffc12 | |
parent | b67c367e0eb81a9062009abb6d5893e91719ca3e (diff) |
Refactor QTEST*_MAIN() implementations
The various variants duplicated some rather complex code around
varying setup in the middle. Rework in terms of a macro that defines
main() and takes the setup code as a parameter. That setup code also
had some common structure, so package that in a setup macro that takes
the class to be used.
Reworked various testlib selftests that were using QTEST_MAIN_IMPL();
change to use the new QTEST_MAIN_WRAPPER() and TEST_MAIN_SETUP().
These might be better dealt with by supporting a second form of the
initMain() test-setup function in the test classes, that takes
references for argc and argv, to let a test massage its command-line
options.
Change-Id: I7fb16b38d51c80ba2f5c9c82f3b7a37ffc636795
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
10 files changed, 65 insertions, 113 deletions
diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h index 894c59f39b..20c80058ac 100644 --- a/src/testlib/qtest.h +++ b/src/testlib/qtest.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Copyright (C) 2020 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** @@ -612,84 +612,57 @@ struct QtCoverageScanner #define TESTLIB_SELFCOVERAGE_START(name) #endif -#define QTEST_APPLESS_MAIN(TestObject) \ +// 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. +#define QTEST_MAIN_WRAPPER(TestObject, ...) \ int main(int argc, char *argv[]) \ { \ - TESTLIB_SELFCOVERAGE_START(TestObject) \ + 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); \ } +// For when you don't even want a QApplication: +#define QTEST_APPLESS_MAIN(TestObject) QTEST_MAIN_WRAPPER(TestObject) + #include <QtTest/qtestsystem.h> #if defined(QT_NETWORK_LIB) # include <QtTest/qtest_network.h> #endif -#if defined(QT_WIDGETS_LIB) - -#include <QtTest/qtest_widgets.h> - -#ifdef QT_KEYPAD_NAVIGATION -# define QTEST_DISABLE_KEYPAD_NAVIGATION QApplication::setNavigationMode(Qt::NavigationModeNone); -#else -# define QTEST_DISABLE_KEYPAD_NAVIGATION -#endif - -#define QTEST_MAIN_IMPL(TestObject) \ - TESTLIB_SELFCOVERAGE_START(#TestObject) \ - QT_PREPEND_NAMESPACE(QTest::Internal::callInitMain)<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); +// Internal +#define QTEST_QAPP_SETUP(klaz) \ + klaz app(argc, argv); \ + app.setAttribute(Qt::AA_Use96Dpi, true); +#if defined(QT_WIDGETS_LIB) +# include <QtTest/qtest_widgets.h> +# ifdef QT_KEYPAD_NAVIGATION +# define QTEST_DISABLE_KEYPAD_NAVIGATION QApplication::setNavigationMode(Qt::NavigationModeNone); +# else +# define QTEST_DISABLE_KEYPAD_NAVIGATION +# endif +// Internal +# define QTEST_MAIN_SETUP() QTEST_QAPP_SETUP(QApplication) QTEST_DISABLE_KEYPAD_NAVIGATION #elif defined(QT_GUI_LIB) - -#include <QtTest/qtest_gui.h> - -#define QTEST_MAIN_IMPL(TestObject) \ - TESTLIB_SELFCOVERAGE_START(#TestObject) \ - QT_PREPEND_NAMESPACE(QTest::Internal::callInitMain)<TestObject>(); \ - QGuiApplication app(argc, argv); \ - app.setAttribute(Qt::AA_Use96Dpi, true); \ - TestObject tc; \ - QTEST_SET_MAIN_SOURCE_PATH \ - return QTest::qExec(&tc, argc, argv); - +# include <QtTest/qtest_gui.h> +// Internal +# define QTEST_MAIN_SETUP() QTEST_QAPP_SETUP(QGuiApplication) #else - -#define QTEST_MAIN_IMPL(TestObject) \ - TESTLIB_SELFCOVERAGE_START(#TestObject) \ - QT_PREPEND_NAMESPACE(QTest::Internal::callInitMain)<TestObject>(); \ - QCoreApplication app(argc, argv); \ - app.setAttribute(Qt::AA_Use96Dpi, true); \ - TestObject tc; \ - QTEST_SET_MAIN_SOURCE_PATH \ - return QTest::qExec(&tc, argc, argv); - +// Internal +# define QTEST_MAIN_SETUP() QTEST_QAPP_SETUP(QCoreApplication) #endif // QT_GUI_LIB -#define QTEST_MAIN(TestObject) \ -int main(int argc, char *argv[]) \ -{ \ - QTEST_MAIN_IMPL(TestObject) \ -} +// For most tests: +#define QTEST_MAIN(TestObject) QTEST_MAIN_WRAPPER(TestObject, QTEST_MAIN_SETUP()) +// For command-line tests #define QTEST_GUILESS_MAIN(TestObject) \ -int main(int argc, char *argv[]) \ -{ \ - TESTLIB_SELFCOVERAGE_START(#TestObject) \ - QT_PREPEND_NAMESPACE(QTest::Internal::callInitMain)<TestObject>(); \ - QCoreApplication app(argc, argv); \ - app.setAttribute(Qt::AA_Use96Dpi, true); \ - TestObject tc; \ - QTEST_SET_MAIN_SOURCE_PATH \ - return QTest::qExec(&tc, argc, argv); \ -} + QTEST_MAIN_WRAPPER(TestObject, QTEST_QAPP_SETUP(QCoreApplication)) #endif diff --git a/tests/auto/testlib/selftests/benchlibcallgrind/tst_benchlibcallgrind.cpp b/tests/auto/testlib/selftests/benchlibcallgrind/tst_benchlibcallgrind.cpp index 353a7f5018..b3cf623375 100644 --- a/tests/auto/testlib/selftests/benchlibcallgrind/tst_benchlibcallgrind.cpp +++ b/tests/auto/testlib/selftests/benchlibcallgrind/tst_benchlibcallgrind.cpp @@ -78,8 +78,7 @@ void tst_BenchlibCallgrind::twoHundredMillionInstructions() #endif } -int main(int argc, char *argv[]) -{ +QTEST_MAIN_WRAPPER(tst_BenchlibCallgrind, std::vector<const char*> args(argv, argv + argc); // Add the -callgrind argument unless (it's there anyway or) we're the // recursive invocation with -callgrindchild passed. @@ -92,9 +91,7 @@ int main(int argc, char *argv[]) argc = args.size(); argv = const_cast<char**>(&args[0]); } - - QTEST_MAIN_IMPL(tst_BenchlibCallgrind) -} + QTEST_MAIN_SETUP()) #undef HAVE_VALGRIND_H #include "tst_benchlibcallgrind.moc" diff --git a/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp b/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp index 40dd0bc25f..9903a1bd59 100644 --- a/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp +++ b/tests/auto/testlib/selftests/benchlibcounting/tst_benchlibcounting.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -59,14 +59,11 @@ void tst_BenchlibCounting::failingBenchmark() }; } -int main(int argc, char *argv[]) -{ +QTEST_MAIN_WRAPPER(tst_BenchlibCounting, std::vector<const char*> args(argv, argv + argc); args.push_back("-eventcounter"); argc = args.size(); argv = const_cast<char**>(&args[0]); - - QTEST_MAIN_IMPL(tst_BenchlibCounting) -} + QTEST_MAIN_SETUP()) #include "tst_benchlibcounting.moc" diff --git a/tests/auto/testlib/selftests/benchlibtickcounter/tst_benchlibtickcounter.cpp b/tests/auto/testlib/selftests/benchlibtickcounter/tst_benchlibtickcounter.cpp index 8f1a06a3c3..97ac22bb94 100644 --- a/tests/auto/testlib/selftests/benchlibtickcounter/tst_benchlibtickcounter.cpp +++ b/tests/auto/testlib/selftests/benchlibtickcounter/tst_benchlibtickcounter.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -62,14 +62,11 @@ void tst_BenchlibTickCounter::threeBillionTicks() #endif } -int main(int argc, char *argv[]) -{ +QTEST_MAIN_WRAPPER(tst_BenchlibTickCounter, std::vector<const char*> args(argv, argv + argc); args.push_back("-tickcounter"); argc = args.size(); argv = const_cast<char**>(&args[0]); - - QTEST_MAIN_IMPL(tst_BenchlibTickCounter) -} + QTEST_MAIN_SETUP()) #include "tst_benchlibtickcounter.moc" diff --git a/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp b/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp index 42746d8fab..9759436ef9 100644 --- a/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp +++ b/tests/auto/testlib/selftests/commandlinedata/tst_commandlinedata.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -63,16 +63,13 @@ void tst_DataTable::fiveTablePasses_data() const QTest::newRow("fiveTablePasses_data5") << true; } -int main(int argc, char *argv[]) -{ +QTEST_MAIN_WRAPPER(tst_DataTable, std::vector<const char*> args(argv, argv + argc); args.push_back("fiveTablePasses"); args.push_back("fiveTablePasses:fiveTablePasses_data1"); args.push_back("-v2"); argc = int(args.size()); argv = const_cast<char**>(&args[0]); - - QTEST_MAIN_IMPL(tst_DataTable) -} + QTEST_MAIN_SETUP()) #include "tst_commandlinedata.moc" diff --git a/tests/auto/testlib/selftests/counting/tst_counting.cpp b/tests/auto/testlib/selftests/counting/tst_counting.cpp index 0831f88005..69cfc91b40 100644 --- a/tests/auto/testlib/selftests/counting/tst_counting.cpp +++ b/tests/auto/testlib/selftests/counting/tst_counting.cpp @@ -290,15 +290,18 @@ void tst_Counting::testSkipInCleanup() qDebug() << "This test function should execute and then QSKIP in cleanup()"; } -int main(int argc, char *argv[]) -{ #ifdef TESTLIB_VERBOSITY_ARG - std::vector<const char*> args(argv, argv + argc); - args.push_back(QT_STRINGIFY(TESTLIB_VERBOSITY_ARG)); - argc = int(args.size()); +#define SETUP() \ + std::vector<const char*> args(argv, argv + argc); \ + args.push_back(QT_STRINGIFY(TESTLIB_VERBOSITY_ARG)); \ + argc = int(args.size()); \ argv = const_cast<char**>(&args[0]); +#else +#define SETUP() #endif - QTEST_MAIN_IMPL(tst_Counting) -} +QTEST_MAIN_WRAPPER(tst_Counting, + SETUP() + QTEST_MAIN_SETUP()) + #include "tst_counting.moc" diff --git a/tests/auto/testlib/selftests/printdatatags/tst_printdatatags.cpp b/tests/auto/testlib/selftests/printdatatags/tst_printdatatags.cpp index d036c64d1f..a2f91896f4 100644 --- a/tests/auto/testlib/selftests/printdatatags/tst_printdatatags.cpp +++ b/tests/auto/testlib/selftests/printdatatags/tst_printdatatags.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -72,14 +72,11 @@ void tst_PrintDataTags::c() const { } -int main(int argc, char *argv[]) -{ +QTEST_MAIN_WRAPPER(tst_PrintDataTags, std::vector<const char*> args(argv, argv + argc); args.push_back("-datatags"); argc = int(args.size()); argv = const_cast<char**>(&args[0]); - - QTEST_MAIN_IMPL(tst_PrintDataTags) -} + QTEST_MAIN_SETUP()) #include "tst_printdatatags.moc" diff --git a/tests/auto/testlib/selftests/printdatatagswithglobaltags/tst_printdatatagswithglobaltags.cpp b/tests/auto/testlib/selftests/printdatatagswithglobaltags/tst_printdatatagswithglobaltags.cpp index e94bec3b64..417df9aedb 100644 --- a/tests/auto/testlib/selftests/printdatatagswithglobaltags/tst_printdatatagswithglobaltags.cpp +++ b/tests/auto/testlib/selftests/printdatatagswithglobaltags/tst_printdatatagswithglobaltags.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -88,14 +88,11 @@ void tst_PrintDataTagsWithGlobalTags::c() const { } -int main(int argc, char *argv[]) -{ +QTEST_MAIN_WRAPPER(tst_PrintDataTagsWithGlobalTags, std::vector<const char*> args(argv, argv + argc); args.push_back("-datatags"); argc = int(args.size()); argv = const_cast<char**>(&args[0]); - - QTEST_MAIN_IMPL(tst_PrintDataTagsWithGlobalTags) -} + QTEST_MAIN_SETUP()) #include "tst_printdatatagswithglobaltags.moc" diff --git a/tests/auto/testlib/selftests/signaldumper/tst_signaldumper.cpp b/tests/auto/testlib/selftests/signaldumper/tst_signaldumper.cpp index f83a3c42f6..6dee51b544 100644 --- a/tests/auto/testlib/selftests/signaldumper/tst_signaldumper.cpp +++ b/tests/auto/testlib/selftests/signaldumper/tst_signaldumper.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -424,14 +424,11 @@ void tst_Signaldumper::deletingSender() emit signalSlotOwner->signalWithoutParameters(); } -int main(int argc, char *argv[]) -{ +QTEST_MAIN_WRAPPER(tst_Signaldumper, std::vector<const char*> args(argv, argv + argc); args.push_back("-vs"); argc = int(args.size()); argv = const_cast<char**>(&args[0]); - - QTEST_MAIN_IMPL(tst_Signaldumper) -} + QTEST_MAIN_SETUP()) #include "tst_signaldumper.moc" diff --git a/tests/auto/testlib/selftests/silent/tst_silent.cpp b/tests/auto/testlib/selftests/silent/tst_silent.cpp index 34b33e1391..87c610f269 100644 --- a/tests/auto/testlib/selftests/silent/tst_silent.cpp +++ b/tests/auto/testlib/selftests/silent/tst_silent.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -102,14 +102,11 @@ void tst_Silent::messages() qFatal("This is a fatal error message that should still appear in silent test output"); } -int main(int argc, char *argv[]) -{ +QTEST_MAIN_WRAPPER(tst_Silent, std::vector<const char*> args(argv, argv + argc); args.push_back("-silent"); argc = int(args.size()); argv = const_cast<char**>(&args[0]); - - QTEST_MAIN_IMPL(tst_Silent) -} + QTEST_MAIN_SETUP()) #include "tst_silent.moc" |