From 0723c6fd059739b33f751e9bc1fe488e2662de72 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 5 Jun 2024 16:01:37 +0200 Subject: [PATCH] QAbstractItemModelTester: Enable testing the QtGui roles without linking to QtGui This enables doing QtGui testing when using QAbstractItemModelTester in Qt for Python, where the QTestlib binding only links against QtCore. Port the code to check against QMetaType constructed from type names. Task-number: PYSIDE-2772 Change-Id: Ifcd8f1ea4758459d8a178226e3f215e5c2b273b8 Reviewed-by: hjk (cherry picked from commit bb542a55b28dd591709ed2c68e4505ec08fc62b5) Reviewed-by: Qt Cherry-pick Bot --- src/testlib/qabstractitemmodeltester.cpp | 48 +++++++++++++++++++-- src/testlib/qabstractitemmodeltester.h | 53 ------------------------ 2 files changed, 45 insertions(+), 56 deletions(-) diff --git a/src/testlib/qabstractitemmodeltester.cpp b/src/testlib/qabstractitemmodeltester.cpp index ddcf328843c..032186c94c0 100644 --- a/src/testlib/qabstractitemmodeltester.cpp +++ b/src/testlib/qabstractitemmodeltester.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -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 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() */ @@ -674,9 +718,7 @@ void QAbstractItemModelTesterPrivate::data() MODELTESTER_VERIFY(sizeHintVariant.canConvert()); Q_Q(QAbstractItemModelTester); - - if (!QTestPrivate::testDataGuiRoles(q)) - return; + testDataGuiRoles(q); } void QAbstractItemModelTesterPrivate::columnsAboutToBeInserted(const QModelIndex &parent, int start, diff --git a/src/testlib/qabstractitemmodeltester.h b/src/testlib/qabstractitemmodeltester.h index c4d94be2618..c2b8eeb93ce 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(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() - || variant.canConvert() - || variant.canConvert() - || variant.canConvert() - || variant.canConvert()); - } - - // General Purpose roles that should return a QFont - variant = model->data(model->index(0, 0), Qt::FontRole); - if (variant.isValid()) - MODELTESTER_VERIFY(variant.canConvert()); - - // 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() || variant.canConvert()); - - variant = model->data(model->index(0, 0), Qt::ForegroundRole); - if (variant.isValid()) - MODELTESTER_VERIFY(variant.canConvert() || variant.canConvert()); - -#undef MODELTESTER_VERIFY - -#else - Q_UNUSED(tester); -#endif // QT_GUI_LIB - - return true; -} -} // namespaceQTestPrivate - QT_END_NAMESPACE #endif // QABSTRACTITEMMODELTESTER_H