summaryrefslogtreecommitdiffstats
path: root/src/testlib
diff options
context:
space:
mode:
Diffstat (limited to 'src/testlib')
-rw-r--r--src/testlib/CMakeLists.txt3
-rw-r--r--src/testlib/qabstractitemmodeltester.cpp54
-rw-r--r--src/testlib/qabstractitemmodeltester.h53
-rw-r--r--src/testlib/qsignalspy.cpp7
-rw-r--r--src/testlib/qsignalspy.h5
-rw-r--r--src/testlib/qtestaccessible.h11
-rw-r--r--src/testlib/qtestblacklist.cpp21
-rw-r--r--src/testlib/qtestcase.h6
-rw-r--r--src/testlib/qtestevent.h15
-rw-r--r--src/testlib/qtesttostring.h2
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