diff options
Diffstat (limited to 'src/testlib')
-rw-r--r-- | src/testlib/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/testlib/qabstractitemmodeltester.cpp | 54 | ||||
-rw-r--r-- | src/testlib/qabstractitemmodeltester.h | 53 | ||||
-rw-r--r-- | src/testlib/qsignalspy.cpp | 7 | ||||
-rw-r--r-- | src/testlib/qsignalspy.h | 5 | ||||
-rw-r--r-- | src/testlib/qtestaccessible.h | 11 | ||||
-rw-r--r-- | src/testlib/qtestblacklist.cpp | 21 | ||||
-rw-r--r-- | src/testlib/qtestcase.h | 6 | ||||
-rw-r--r-- | src/testlib/qtestevent.h | 15 | ||||
-rw-r--r-- | src/testlib/qtesttostring.h | 2 |
10 files changed, 98 insertions, 79 deletions
diff --git a/src/testlib/CMakeLists.txt b/src/testlib/CMakeLists.txt index e956a47cf1..944bd9876d 100644 --- a/src/testlib/CMakeLists.txt +++ b/src/testlib/CMakeLists.txt @@ -78,7 +78,8 @@ qt_internal_add_module(Test Qt::Core PRIVATE_MODULE_INTERFACE Qt::CorePrivate - GENERATE_CPP_EXPORTS + ATTRIBUTION_FILE_DIR_PATHS + 3rdparty ) if(TARGET Gui) diff --git a/src/testlib/qabstractitemmodeltester.cpp b/src/testlib/qabstractitemmodeltester.cpp index eb52d28d59..42a6eb38f0 100644 --- a/src/testlib/qabstractitemmodeltester.cpp +++ b/src/testlib/qabstractitemmodeltester.cpp @@ -6,6 +6,7 @@ #include <private/qobject_p.h> #include <private/qabstractitemmodel_p.h> +#include <QtCore/qmetatype.h> #include <QtCore/QPointer> #include <QtCore/QAbstractItemModel> #include <QtCore/QStack> @@ -14,7 +15,7 @@ QT_BEGIN_NAMESPACE -Q_LOGGING_CATEGORY(lcModelTest, "qt.modeltest") +Q_STATIC_LOGGING_CATEGORY(lcModelTest, "qt.modeltest") #define MODELTESTER_VERIFY(statement) \ do { \ @@ -73,6 +74,7 @@ private: void checkChildren(const QModelIndex &parent, int currentDepth = 0); bool verify(bool statement, const char *statementStr, const char *description, const char *file, int line); + void testDataGuiRoles(QAbstractItemModelTester *tester); template<typename T1, typename T2> bool compare(const T1 &t1, const T2 &t2, @@ -623,6 +625,48 @@ void QAbstractItemModelTesterPrivate::checkChildren(const QModelIndex &parent, i } } +void QAbstractItemModelTesterPrivate::testDataGuiRoles(QAbstractItemModelTester *tester) +{ + const auto model = tester->model(); + Q_ASSERT(model); + + if (!model->hasChildren()) + return; + + static const QMetaType pixmapType = QMetaType(QMetaType::QPixmap); + if (!pixmapType.isValid()) + return; + + static const QMetaType imageType = QMetaType(QMetaType::QImage); + static const QMetaType iconType = QMetaType(QMetaType::QIcon); + static const QMetaType colorType = QMetaType(QMetaType::QColor); + static const QMetaType brushType = QMetaType(QMetaType::QBrush); + static const QMetaType fontType = QMetaType(QMetaType::QFont); + + QVariant variant = model->data(model->index(0, 0), Qt::DecorationRole); + if (variant.isValid()) { + MODELTESTER_VERIFY(variant.canConvert(pixmapType) + || variant.canConvert(imageType) + || variant.canConvert(iconType) + || variant.canConvert(colorType) + || variant.canConvert(brushType)); + } + + // General Purpose roles that should return a QFont + variant = model->data(model->index(0, 0), Qt::FontRole); + if (variant.isValid()) + MODELTESTER_VERIFY(variant.canConvert(fontType)); + + // General Purpose roles that should return a QColor or a QBrush + variant = model->data(model->index(0, 0), Qt::BackgroundRole); + if (variant.isValid()) + MODELTESTER_VERIFY(variant.canConvert(colorType) || variant.canConvert(brushType)); + + variant = model->data(model->index(0, 0), Qt::ForegroundRole); + if (variant.isValid()) + MODELTESTER_VERIFY(variant.canConvert(colorType) || variant.canConvert(brushType)); +} + /* Tests model's implementation of QAbstractItemModel::data() */ @@ -669,10 +713,12 @@ void QAbstractItemModelTesterPrivate::data() || state == Qt::Checked); } - Q_Q(QAbstractItemModelTester); + QVariant sizeHintVariant = model->data(model->index(0, 0), Qt::SizeHintRole); + if (sizeHintVariant.isValid()) + MODELTESTER_VERIFY(sizeHintVariant.canConvert<QSize>()); - if (!QTestPrivate::testDataGuiRoles(q)) - return; + Q_Q(QAbstractItemModelTester); + testDataGuiRoles(q); } void QAbstractItemModelTesterPrivate::columnsAboutToBeInserted(const QModelIndex &parent, int start, diff --git a/src/testlib/qabstractitemmodeltester.h b/src/testlib/qabstractitemmodeltester.h index c4d94be261..c2b8eeb93c 100644 --- a/src/testlib/qabstractitemmodeltester.h +++ b/src/testlib/qabstractitemmodeltester.h @@ -50,62 +50,9 @@ public: void setUseFetchMore(bool value); private: - friend inline bool QTestPrivate::testDataGuiRoles(QAbstractItemModelTester *tester); bool verify(bool statement, const char *statementStr, const char *description, const char *file, int line); }; -namespace QTestPrivate { -inline bool testDataGuiRoles(QAbstractItemModelTester *tester) -{ -#ifdef QT_GUI_LIB - -#define MODELTESTER_VERIFY(statement) \ -do { \ - if (!tester->verify(static_cast<bool>(statement), #statement, "", __FILE__, __LINE__)) \ - return false; \ -} while (false) - - const auto model = tester->model(); - Q_ASSERT(model); - - if (!model->hasChildren()) - return true; - - QVariant variant; - - variant = model->data(model->index(0, 0), Qt::DecorationRole); - if (variant.isValid()) { - MODELTESTER_VERIFY(variant.canConvert<QPixmap>() - || variant.canConvert<QImage>() - || variant.canConvert<QIcon>() - || variant.canConvert<QColor>() - || variant.canConvert<QBrush>()); - } - - // General Purpose roles that should return a QFont - variant = model->data(model->index(0, 0), Qt::FontRole); - if (variant.isValid()) - MODELTESTER_VERIFY(variant.canConvert<QFont>()); - - // General Purpose roles that should return a QColor or a QBrush - variant = model->data(model->index(0, 0), Qt::BackgroundRole); - if (variant.isValid()) - MODELTESTER_VERIFY(variant.canConvert<QColor>() || variant.canConvert<QBrush>()); - - variant = model->data(model->index(0, 0), Qt::ForegroundRole); - if (variant.isValid()) - MODELTESTER_VERIFY(variant.canConvert<QColor>() || variant.canConvert<QBrush>()); - -#undef MODELTESTER_VERIFY - -#else - Q_UNUSED(tester); -#endif // QT_GUI_LIB - - return true; -} -} // namespaceQTestPrivate - QT_END_NAMESPACE #endif // QABSTRACTITEMMODELTESTER_H diff --git a/src/testlib/qsignalspy.cpp b/src/testlib/qsignalspy.cpp index a45ca59378..116ce87c3e 100644 --- a/src/testlib/qsignalspy.cpp +++ b/src/testlib/qsignalspy.cpp @@ -216,7 +216,7 @@ QSignalSpy::ObjectSignal QSignalSpy::verify(const QObject *obj, QMetaMethod sign return {}; } -QList<int> QSignalSpy::makeArgs(const QMetaMethod &member, const QObject *obj) +static QList<int> makeArgs(QMetaMethod member, const QObject *obj) { QList<int> result; result.reserve(member.parameterCount()); @@ -250,7 +250,8 @@ public: }; QSignalSpy::QSignalSpy(ObjectSignal os) - : args(os.obj ? makeArgs(os.sig, os.obj) : QList<int>{}) + : sig(os.sig.methodSignature()), + args(os.obj ? makeArgs(os.sig, os.obj) : QList<int>{}) { if (!os.obj) return; @@ -266,8 +267,6 @@ QSignalSpy::QSignalSpy(ObjectSignal os) } d_ptr = std::move(i); - - sig = os.sig.methodSignature(); } /*! diff --git a/src/testlib/qsignalspy.h b/src/testlib/qsignalspy.h index 591545b4d5..b8df2a4deb 100644 --- a/src/testlib/qsignalspy.h +++ b/src/testlib/qsignalspy.h @@ -41,7 +41,7 @@ public: : QSignalSpy(verify(obj, signal)) {} Q_TESTLIB_EXPORT ~QSignalSpy(); - inline bool isValid() const { return !sig.isEmpty(); } + bool isValid() const noexcept { return d_ptr != nullptr; } inline QByteArray signal() const { return sig; } bool wait(int timeout) @@ -55,11 +55,10 @@ private: Q_TESTLIB_EXPORT static ObjectSignal verify(const QObject *obj, QMetaMethod signal); Q_TESTLIB_EXPORT static ObjectSignal verify(const QObject *obj, const char *aSignal); - Q_TESTLIB_EXPORT static QList<int> makeArgs(const QMetaMethod &member, const QObject *obj); Q_TESTLIB_EXPORT void appendArgs(void **a); // the full, normalized signal name - QByteArray sig; + const QByteArray sig; // holds the QMetaType types for the argument list of the signal const QList<int> args; diff --git a/src/testlib/qtestaccessible.h b/src/testlib/qtestaccessible.h index a4236aa5f3..29f69bd819 100644 --- a/src/testlib/qtestaccessible.h +++ b/src/testlib/qtestaccessible.h @@ -228,6 +228,17 @@ private: newEvent->setLastRow(oldEvent->lastRow()); newEvent->setLastColumn(oldEvent->lastColumn()); ev = newEvent; + } else if (event->type() == QAccessible::Announcement) { + QAccessibleAnnouncementEvent *oldEvent = + static_cast<QAccessibleAnnouncementEvent *>(event); + QAccessibleAnnouncementEvent *newEvent; + if (event->object()) + newEvent = new QAccessibleAnnouncementEvent(event->object(), oldEvent->message()); + else + newEvent = new QAccessibleAnnouncementEvent(event->accessibleInterface(), + oldEvent->message()); + newEvent->setPoliteness(oldEvent->politeness()); + ev = newEvent; } else { if (event->object()) ev = new QAccessibleEvent(event->object(), event->type()); diff --git a/src/testlib/qtestblacklist.cpp b/src/testlib/qtestblacklist.cpp index 4154f8f2a6..95dfb28e69 100644 --- a/src/testlib/qtestblacklist.cpp +++ b/src/testlib/qtestblacklist.cpp @@ -23,7 +23,9 @@ using namespace Qt::StringLiterals; Blank lines and everything after # is simply ignored. An initial #-line referring to this documentation is kind to readers. Comments can also be used - to indicate the reasons for ignoring particular cases. + to indicate the reasons for ignoring particular cases. Please scope comments + to keywords if possible, to avoid confusion when additional keywords or tests + cases are added later. Each blacklist line is interpreted as a list of keywords in an AND-relationship. To blacklist a test for multiple platforms (OR-relationship), use separate lines. @@ -53,18 +55,15 @@ using namespace Qt::StringLiterals; # Test doesn't work on QNX at all qnx - # QTBUG-12345 [testFunction] - linux - windows 64bit + linux # QTBUG-12345 + windows 64bit # QTBUG-12345 - # Flaky in COIN on macOS, not reproducible by developers [testSlowly] - macos ci + macos ci # Flaky in COIN on macOS, not reproducible by developers - # Needs basic C++11 support [testfunction2:testData] - msvc-2010 + msvc-2010 # Needs basic C++11 support [getFile:withProxy SSL:localhost] android @@ -75,9 +74,8 @@ using namespace Qt::StringLiterals; For example, to blacklist a QML test on RHEL 7.6: - # QTBUG-12345 [Button::test_display:TextOnly] - ci rhel-7.6 + ci rhel-7.6 # QTBUG-12345 Keys are lower-case. Distribution name and version are supported if QSysInfo's productType() and productVersion() return them. @@ -127,6 +125,9 @@ static QSet<QByteArray> keywords() #ifdef Q_OS_QNX << "qnx" #endif +#ifdef Q_OS_VXWORKS + << "vxworks" +#endif #ifdef Q_OS_WEBOS << "webos" #endif diff --git a/src/testlib/qtestcase.h b/src/testlib/qtestcase.h index a855ace6a9..44371c00a1 100644 --- a/src/testlib/qtestcase.h +++ b/src/testlib/qtestcase.h @@ -26,7 +26,7 @@ QT_BEGIN_NAMESPACE #ifndef QT_NO_EXCEPTIONS -#ifdef QTEST_THROW_ON_FAILURE +#ifdef QTEST_THROW_ON_FAIL # define QTEST_FAIL_ACTION QTest::Internal::throwOnFail() #else # define QTEST_FAIL_ACTION do { QTest::Internal::maybeThrowOnFail(); return; } while (false) @@ -39,8 +39,8 @@ QT_BEGIN_NAMESPACE #endif #else -# if defined(QTEST_THROW_ON_FAILURE) || defined(QTEST_THROW_ON_SKIP) -# error QTEST_THROW_ON_FAILURE/SKIP require exception support enabled. +# if defined(QTEST_THROW_ON_FAIL) || defined(QTEST_THROW_ON_SKIP) +# error QTEST_THROW_ON_FAIL/SKIP require exception support enabled. # endif #endif // QT_NO_EXCEPTIONS diff --git a/src/testlib/qtestevent.h b/src/testlib/qtestevent.h index 8f092cf8c9..3b75e07f62 100644 --- a/src/testlib/qtestevent.h +++ b/src/testlib/qtestevent.h @@ -28,6 +28,9 @@ QT_BEGIN_NAMESPACE # define QT_ONLY_WIDGETLIB_USES Q_DECL_UNUSED_MEMBER #endif +QT_WARNING_PUSH +QT_WARNING_DISABLE_CLANG("-Wweak-vtables") // QTBUG-1044486 + class QTestEvent { public: @@ -36,13 +39,15 @@ public: #endif virtual QTestEvent *clone() const = 0; - virtual ~QTestEvent() {} + virtual ~QTestEvent() = default; // ### FIXME: weak vtable (QTBUG-104486) }; #ifdef QT_GUI_LIB class QTestKeyEvent: public QTestEvent { public: + ~QTestKeyEvent() override = default; // ### FIXME: weak vtable (QTBUG-104486) + inline QTestKeyEvent(QTest::KeyAction action, Qt::Key key, Qt::KeyboardModifiers modifiers, int delay) : _action(action), _delay(delay), _modifiers(modifiers), _ascii(0), _key(key) {} inline QTestKeyEvent(QTest::KeyAction action, char ascii, Qt::KeyboardModifiers modifiers, int delay) @@ -71,6 +76,8 @@ protected: class QTestKeyClicksEvent: public QTestEvent { public: + ~QTestKeyClicksEvent() override = default; // ### FIXME: weak vtables (QTBUG-104486) + inline QTestKeyClicksEvent(const QString &keys, Qt::KeyboardModifiers modifiers, int delay) : _keys(keys), _modifiers(modifiers), _delay(delay) {} inline QTestEvent *clone() const override { return new QTestKeyClicksEvent(*this); } @@ -91,6 +98,8 @@ private: class QTestMouseEvent: public QTestEvent { public: + ~QTestMouseEvent() override = default; // ### FIXME: weak vtables (QTBUG-104486) + inline QTestMouseEvent(QTest::MouseAction action, Qt::MouseButton button, Qt::KeyboardModifiers modifiers, QPoint position, int delay) : _action(action), _button(button), _modifiers(modifiers), _pos(position), _delay(delay) {} @@ -117,6 +126,8 @@ class QTestDelayEvent: public QTestEvent { public: inline QTestDelayEvent(int msecs): _delay(msecs) {} + ~QTestDelayEvent() override = default; // ### FIXME: weak vtables (QTBUG-104486) + inline QTestEvent *clone() const override { return new QTestDelayEvent(*this); } #ifdef QT_WIDGETS_LIB @@ -190,6 +201,8 @@ public: #undef QT_ONLY_WIDGETLIB_USES +QT_WARNING_POP // Clang -Wweak-vtables + QT_END_NAMESPACE Q_DECLARE_METATYPE(QTestEventList) diff --git a/src/testlib/qtesttostring.h b/src/testlib/qtesttostring.h index 18262332ba..a1ee4f6925 100644 --- a/src/testlib/qtesttostring.h +++ b/src/testlib/qtesttostring.h @@ -7,6 +7,8 @@ #include <QtTest/qttestglobal.h> +#include <QtCore/qttypetraits.h> + #if QT_CONFIG(itemmodel) # include <QtCore/qabstractitemmodel.h> #endif |