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>
This commit is contained in:
Edward Welbourne 2021-09-28 15:12:48 +02:00
parent b67c367e0e
commit 37bc11e707
10 changed files with 65 additions and 113 deletions

View File

@ -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
// 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
#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);
# 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

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"