summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp66
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp282
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp8
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp100
-rw-r--r--tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp1
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp22
-rw-r--r--tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp37
7 files changed, 484 insertions, 32 deletions
diff --git a/tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp b/tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp
index 4124b723b4c..ef4a535dcac 100644
--- a/tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp
+++ b/tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp
@@ -1025,8 +1025,18 @@ void tst_QRangeModelAdapter::modelReset()
QCOMPARE(adapter[0], 3);
QCOMPARE(adapter, (std::vector<int>{3, 2, 1}));
+ modelAboutToBeResetSpy.clear();
+ modelResetSpy.clear();
std::vector<int> modifiedData = adapter;
+
+ adapter.assign(modifiedData.begin(), modifiedData.end());
+ QCOMPARE(modelResetSpy.count(), 1);
+ adapter.setRange(std::vector<int>{3, 2, 1});
+ QCOMPARE(modelResetSpy.count(), 2);
+ std::vector<short> shorts = {10, 11, 12};
+ adapter.assign(shorts.begin(), shorts.end());
+ QCOMPARE(modelResetSpy.count(), 3);
}
{
@@ -1533,7 +1543,7 @@ void tst_QRangeModelAdapter::tableWriteAccess()
QTest::ignoreMessage(QtCriticalMsg,
QRegularExpression("Not able to assign QVariant"));
QTest::ignoreMessage(QtWarningMsg, QRegularExpression("Writing value of type Object\\* to "
- "role Qt::RangeModelAdapterRole at index .* of the model failed"));
+ "role Qt::RangeModelAdapterRole at index .* failed"));
#endif
adapter.at(0, 0) = new Object;
QCOMPARE(dataChangedSpy.count(), 0);
@@ -2620,11 +2630,35 @@ using ObjectTree = std::vector<ObjectTreeItem>;
class ObjectTreeItem : public ObjectRow
{
public:
- ObjectTreeItem(Object *item = nullptr)
+ ObjectTreeItem() = default;
+
+ explicit ObjectTreeItem(Object *item)
{
m_objects[0] = item;
}
+ ObjectTreeItem(const ObjectTreeItem &other) = delete;
+ ObjectTreeItem &operator=(const ObjectTreeItem &other) = delete;
+ ObjectTreeItem(ObjectTreeItem &&other) noexcept
+ {
+ m_children = std::move(other.m_children);
+ m_objects = std::move(other.m_objects);
+ other.m_objects = {};
+ }
+
+ ObjectTreeItem &operator=(ObjectTreeItem &&other) noexcept
+ {
+ m_children = std::move(other.m_children);
+ m_objects = std::move(other.m_objects);
+ other.m_objects = {};
+ return *this;
+ }
+
+ ~ObjectTreeItem()
+ {
+ qDeleteAll(m_objects);
+ }
+
ObjectTreeItem *parentRow() const { return m_parentRow; }
void setParentRow(ObjectTreeItem *parentRow) { m_parentRow = parentRow; }
const auto &childRows() const { return m_children; }
@@ -2646,9 +2680,7 @@ namespace std {
void tst_QRangeModelAdapter::insertAutoConnectObjects()
{
- ObjectTree emptyTree;
-
- QRangeModelAdapter adapter(emptyTree);
+ QRangeModelAdapter adapter(ObjectTree{});
QSignalSpy dataChangedSpy(adapter.model(), &QAbstractItemModel::dataChanged);
adapter.model()->setAutoConnectPolicy(QRangeModel::AutoConnectPolicy::Full);
@@ -2662,11 +2694,11 @@ void tst_QRangeModelAdapter::insertAutoConnectObjects()
Object *newChild = new Object;
auto firstRow = adapter.begin();
- (*firstRow).children() = ObjectTree{
- ObjectTreeItem(newChild),
- ObjectTreeItem(),
- ObjectTreeItem()
- };
+ {
+ ObjectTree children(3);
+ children[0] = ObjectTreeItem(newChild);
+ (*firstRow).children() = std::move(children);
+ }
QCOMPARE(dataChangedSpy.count(), 0);
QVERIFY(adapter.hasChildren(0));
newChild->setString("0.0");
@@ -2684,12 +2716,14 @@ void tst_QRangeModelAdapter::insertAutoConnectObjects()
newChild = new Object;
Object *newGrandChild = new Object;
ObjectTreeItem newBranch(newChild);
- newBranch.childRows() = ObjectTree{
- ObjectTreeItem(), // skip the first row to verify that we continue through nullptr
- ObjectTreeItem(newGrandChild),
- ObjectTreeItem()
- };
- adapter.at({0, 2}) = newBranch;
+ {
+ ObjectTree children(3);
+ // skip the first row to verify that we continue through nullptr
+ children[1] = ObjectTreeItem(newGrandChild);
+ newBranch.childRows() = std::move(children);
+ }
+ adapter.at({0, 2}) = std::move(newBranch);
+ QCOMPARE(adapter.rowCount({0, 2}), 3);
QCOMPARE(dataChangedSpy.count(), 1);
newChild->setNumber(1);
QCOMPARE(dataChangedSpy.count(), 2);
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index 2fcfd056882..a30ed901fe6 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -6,6 +6,8 @@
#include <qvariant.h>
#include <QtCore/qttypetraits.h>
+#include <QtCore/qsequentialiterable.h>
+#include <QtCore/qassociativeiterable.h>
// don't assume <type_traits>
template <typename T, typename U>
@@ -5025,7 +5027,7 @@ void sortIterable(QMetaSequence::Iterable *iterable)
}
template<typename Container>
-static void testSequentialIteration()
+static void testMetaSequenceIteration()
{
QFETCH(bool, hasSizeAccessor);
QFETCH(bool, hasIndexedAccessors);
@@ -5157,7 +5159,7 @@ static void testSequentialIteration()
}
template<typename Container>
-static void testAssociativeIteration()
+static void testMetaAssociationIteration()
{
using Key = typename Container::key_type;
using Mapped = typename Container::mapped_type;
@@ -5228,12 +5230,268 @@ static void testAssociativeIteration()
QCOMPARE(f, iter.constEnd());
}
+#if QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && QT_DEPRECATED_SINCE(6, 15)
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+
+template<typename Iterator>
+void sortIterable(QSequentialIterable *iterable)
+{
+ std::sort(Iterator(iterable->mutableBegin()), Iterator(iterable->mutableEnd()),
+ [&](const QVariant &a, const QVariant &b) {
+ return a.toInt() < b.toInt();
+ });
+}
+
+template<typename Container>
+static void testSequentialIteration()
+{
+ QFETCH(bool, hasSizeAccessor);
+ const auto ignoreSizeWarning = [hasSizeAccessor]() {
+ if (hasSizeAccessor)
+ return;
+ QTest::ignoreMessage(
+ QtWarningMsg,
+ "size() called on an iterable without native size accessor. This is slow");
+ };
+ QTest::failOnWarning();
+
+ int numSeen = 0;
+ Container sequence;
+ ContainerAPI<Container>::insert(sequence, 1);
+ ContainerAPI<Container>::insert(sequence, 2);
+ ContainerAPI<Container>::insert(sequence, 3);
+
+ QVariant listVariant = QVariant::fromValue(sequence);
+ QVERIFY(listVariant.canConvert<QVariantList>());
+ QVariantList varList = listVariant.value<QVariantList>();
+ ignoreSizeWarning();
+ QCOMPARE(varList.size(), (int)std::distance(sequence.begin(), sequence.end()));
+ QSequentialIterable listIter = listVariant.view<QSequentialIterable>();
+ ignoreSizeWarning();
+ QCOMPARE(varList.size(), listIter.size());
+
+ typename Container::iterator containerIter = sequence.begin();
+ const typename Container::iterator containerEnd = sequence.end();
+ ignoreSizeWarning();
+ for (int i = 0, end = listIter.size(); i < end; ++i, ++containerIter, ++numSeen)
+ {
+ QVERIFY(ContainerAPI<Container >::compare(listIter.at(i), *containerIter));
+ QVERIFY(ContainerAPI<Container >::compare(listIter.at(i), varList.at(i)));
+ }
+ QCOMPARE(numSeen, (int)std::distance(sequence.begin(), sequence.end()));
+ QCOMPARE(containerIter, containerEnd);
+
+ numSeen = 0;
+ containerIter = sequence.begin();
+ for (QVariant v : listIter) {
+ QVERIFY(ContainerAPI<Container>::compare(v, *containerIter));
+ QVERIFY(ContainerAPI<Container>::compare(v, varList.at(numSeen)));
+ ++containerIter;
+ ++numSeen;
+ }
+ QCOMPARE(numSeen, (int)std::distance(sequence.begin(), sequence.end()));
+
+ auto compareLists = [&]() {
+ int numSeen = 0;
+ auto varList = listVariant.value<QVariantList>();
+ auto varIter = varList.begin();
+ for (const QVariant &v : std::as_const(listIter)) {
+ QVERIFY(ContainerAPI<Container>::compare(v, *varIter));
+ ++varIter;
+ ++numSeen;
+ }
+ QCOMPARE(varIter, varList.end());
+ numSeen = 0;
+ auto constVarIter = varList.constBegin();
+ for (QVariant v : listIter) {
+ QVERIFY(ContainerAPI<Container>::compare(v, *constVarIter));
+ ++constVarIter;
+ ++numSeen;
+ }
+ QCOMPARE(numSeen, (int)std::distance(varList.begin(), varList.end()));
+ };
+ compareLists();
+
+ QVariant first = listIter.at(0);
+ QVariant second = listIter.at(1);
+ QVariant third = listIter.at(2);
+ compareLists();
+ listIter.addValue(third);
+ compareLists();
+ listIter.addValue(second);
+ compareLists();
+ listIter.addValue(first);
+ compareLists();
+
+ QCOMPARE(listIter.size(), 6);
+
+ if (listIter.canRandomAccessIterate())
+ sortIterable<QSequentialIterable::RandomAccessIterator>(&listIter);
+ else if (listIter.canReverseIterate())
+ sortIterable<QSequentialIterable::BidirectionalIterator>(&listIter);
+ else if (listIter.canForwardIterate())
+ return; // std::sort cannot sort with only forward iterators.
+ else
+ QFAIL("The container has no meaningful iterators");
+
+ compareLists();
+ ignoreSizeWarning();
+ QCOMPARE(listIter.size(), 6);
+ QCOMPARE(listIter.at(0), first);
+ QCOMPARE(listIter.at(1), first);
+ QCOMPARE(listIter.at(2), second);
+ QCOMPARE(listIter.at(3), second);
+ QCOMPARE(listIter.at(4), third);
+ QCOMPARE(listIter.at(5), third);
+
+ if (listIter.metaContainer().canRemoveValue()) {
+ listIter.removeValue();
+ compareLists();
+ ignoreSizeWarning();
+ QCOMPARE(listIter.size(), 5);
+ QCOMPARE(listIter.at(0), first);
+ QCOMPARE(listIter.at(1), first);
+ QCOMPARE(listIter.at(2), second);
+ QCOMPARE(listIter.at(3), second);
+ QCOMPARE(listIter.at(4), third);
+ } else {
+ // QString and QByteArray have no pop_back or pop_front and it's unclear what other
+ // method we should use to remove an item.
+ QVERIFY((std::is_same_v<Container, QString> || std::is_same_v<Container, QByteArray>));
+ }
+
+ auto i = listIter.mutableBegin();
+ QVERIFY(i != listIter.mutableEnd());
+
+ *i = QStringLiteral("17");
+ if (listIter.metaContainer().valueMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(listIter.at(0).toInt(), 17);
+ else if (listIter.metaContainer().valueMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(listIter.at(0).toBool(), false);
+
+ *i = QStringLiteral("true");
+ if (listIter.metaContainer().valueMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(listIter.at(0).toInt(), 0);
+ else if (listIter.metaContainer().valueMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(listIter.at(0).toBool(), true);
+}
+
+template<typename Container>
+static void testAssociativeIteration()
+{
+ using Key = typename Container::key_type;
+ using Mapped = typename Container::mapped_type;
+
+ int numSeen = 0;
+ Container mapping;
+ mapping[5] = true;
+ mapping[15] = false;
+
+ QVariant mappingVariant = QVariant::fromValue(mapping);
+ QVariantMap varMap = mappingVariant.value<QVariantMap>();
+ QVariantMap varHash = mappingVariant.value<QVariantMap>();
+ QAssociativeIterable mappingIter = mappingVariant.view<QAssociativeIterable>();
+
+ typename Container::const_iterator containerIter = mapping.begin();
+ const typename Container::const_iterator containerEnd = mapping.end();
+ for ( ;containerIter != containerEnd; ++containerIter, ++numSeen)
+ {
+ Mapped expected = KeyGetter<Container>::value(containerIter);
+ Key key = KeyGetter<Container>::get(containerIter);
+ Mapped actual = qvariant_cast<Mapped>(mappingIter.value(key));
+ QCOMPARE(qvariant_cast<Mapped>(varMap.value(QString::number(key))), expected);
+ QCOMPARE(qvariant_cast<Mapped>(varHash.value(QString::number(key))), expected);
+ QCOMPARE(actual, expected);
+ const QAssociativeIterable::const_iterator it = mappingIter.find(key);
+ QVERIFY(it != mappingIter.end());
+ QCOMPARE(it.value().value<Mapped>(), expected);
+ }
+ QCOMPARE(numSeen, (int)std::distance(mapping.begin(), mapping.end()));
+ QCOMPARE(containerIter, containerEnd);
+ QVERIFY(mappingIter.find(10) == mappingIter.end());
+
+ auto i = mappingIter.mutableFind(QStringLiteral("nonono"));
+ QCOMPARE(i, mappingIter.mutableEnd());
+ i = mappingIter.mutableFind(QStringLiteral("5"));
+ QVERIFY(i != mappingIter.mutableEnd());
+
+ *i = QStringLiteral("17");
+
+ if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(mappingIter.value(5).toInt(), 17);
+ else if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(mappingIter.value(5).toBool(), true);
+
+ *i = QStringLiteral("true");
+ if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(mappingIter.value(5).toInt(), 0);
+ else if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(mappingIter.value(5).toBool(), true);
+
+ QVERIFY(mappingIter.containsKey("5"));
+ mappingIter.removeKey(QStringLiteral("5"));
+ QCOMPARE(mappingIter.find(5), mappingIter.end());
+
+ mappingIter.setValue(5, 44);
+ if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<int>())
+ QCOMPARE(mappingIter.value(5).toInt(), 44);
+ else if (mappingIter.metaContainer().mappedMetaType() == QMetaType::fromType<bool>())
+ QCOMPARE(mappingIter.value(5).toBool(), true);
+
+ // Test that find() does not coerce
+ auto container = Container();
+ container[0] = true;
+
+ QVariant containerVariant = QVariant::fromValue(container);
+ QAssociativeIterable iter = containerVariant.value<QAssociativeIterable>();
+ auto f = iter.constFind(QStringLiteral("anything"));
+ QCOMPARE(f, iter.constEnd());
+}
+
+template<typename T>
+static void addRowSequential(const char *name, bool hasSizeAccessor, bool hasIndexedAccessor)
+{
+ QTest::newRow(name)
+ << &testMetaSequenceIteration<T> << hasSizeAccessor << hasIndexedAccessor;
+ QTest::addRow("%s_old", name)
+ << &testSequentialIteration<T> << hasSizeAccessor << hasIndexedAccessor;
+}
+
+template<typename C>
+static void addRowAssociative(const char *name)
+{
+ QTest::newRow(name)
+ << &testMetaAssociationIteration<C>;
+ QTest::addRow("%s_old", name)
+ << &testAssociativeIteration<C>;
+}
+
+QT_WARNING_POP
+#else
+
+template<typename T>
+static void addRowSequential(const char *name, bool hasSizeAccessor, bool hasIndexedAccessor)
+{
+ QTest::newRow(name)
+ << &testMetaSequenceIteration<T> << hasSizeAccessor << hasIndexedAccessor;
+}
+
+template<typename C>
+static void addRowAssociative(const char *name)
+{
+ QTest::newRow(name)
+ << &testMetaAssociationIteration<C>;
+}
+
+#endif // QT_VERSION < QT_VERSION_CHECK(7, 0, 0) && QT_DEPRECATED_SINCE(6, 15)
+
void tst_QVariant::iterateSequentialContainerElements_data()
{
QTest::addColumn<QFunctionPointer>("testFunction");
QTest::addColumn<bool>("hasSizeAccessor");
QTest::addColumn<bool>("hasIndexedAccessors");
-#define ADD(T) QTest::newRow(#T) << &testSequentialIteration<T> << true << true
+#define ADD(T) addRowSequential<T>(#T, true, true)
ADD(QQueue<int>);
ADD(QQueue<QVariant>);
ADD(QQueue<QString>);
@@ -5253,13 +5511,13 @@ void tst_QVariant::iterateSequentialContainerElements_data()
ADD(QByteArray);
#undef ADD
-#define ADD(T) QTest::newRow(#T) << &testSequentialIteration<T> << true << false
+#define ADD(T) addRowSequential<T>(#T, true, false)
ADD(std::list<int>);
ADD(std::list<QVariant>);
ADD(std::list<QString>);
#undef ADD
-#define ADD(T) QTest::newRow(#T) << &testSequentialIteration<T> << false << false
+#define ADD(T) addRowSequential<T>(#T, false, false)
#ifdef TEST_FORWARD_LIST
ADD(std::forward_list<int>);
ADD(std::forward_list<QVariant>);
@@ -5271,7 +5529,7 @@ void tst_QVariant::iterateSequentialContainerElements_data()
void tst_QVariant::iterateAssociativeContainerElements_data()
{
QTest::addColumn<QFunctionPointer>("testFunction");
-#define ADD(C, K, V) QTest::newRow(#C #K #V) << &testAssociativeIteration<C<K, V>>;
+#define ADD(C, K, V) addRowAssociative<C<K, V>>(#C "<" #K "," #V ">");
ADD(QHash, int, bool);
ADD(QHash, int, int);
ADD(QMap, int, bool);
@@ -6448,15 +6706,15 @@ void tst_QVariant::get_NonDefaultConstructible()
struct QVariantWrapper
{
public:
- static constexpr bool canNoexceptConvertToQVariant
+ static constexpr bool CanNoexceptConvertToQVariant
= std::is_nothrow_copy_constructible_v<QVariant>;
- static constexpr bool canNoexceptAssignQVariant
+ static constexpr bool CanNoexceptAssignQVariant
= std::is_nothrow_copy_assignable_v<QVariant>;
QVariantWrapper(QVariant *content = nullptr) noexcept : m_content(content) {}
- QVariant content() const noexcept(canNoexceptConvertToQVariant) { return *m_content; }
- void setContent(const QVariant &content) noexcept(canNoexceptAssignQVariant)
+ QVariant content() const noexcept(CanNoexceptConvertToQVariant) { return *m_content; }
+ void setContent(const QVariant &content) noexcept(CanNoexceptAssignQVariant)
{
*m_content = content;
}
@@ -6468,14 +6726,14 @@ private:
QT_BEGIN_NAMESPACE
template<>
QVariant::ConstReference<QVariantWrapper>::operator QVariant() const
- noexcept(QVariantWrapper::canNoexceptConvertToQVariant)
+ noexcept(QVariantWrapper::CanNoexceptConvertToQVariant)
{
return m_referred.content();
}
template<>
QVariant::Reference<QVariantWrapper> &QVariant::Reference<QVariantWrapper>::operator=(
- const QVariant &content) noexcept(QVariantWrapper::canNoexceptAssignQVariant)
+ const QVariant &content) noexcept(QVariantWrapper::CanNoexceptAssignQVariant)
{
m_referred.setContent(content);
return *this;
diff --git a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
index 2d9d351286f..f1f88891015 100644
--- a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
+++ b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
@@ -63,11 +63,11 @@ using namespace Qt::StringLiterals;
#elif defined(Q_OS_WIN)
# undef dll_VALID
# define dll_VALID true
-//# ifdef QT_NO_DEBUG
+# if !defined(QT_NO_DEBUG) && defined(Q_CC_MSVC)
+# define SUFFIX "d.dll"
+# else
# define SUFFIX ".dll"
-//# else
-//# define SUFFIX "d.dll"
-//# endif
+# endif
# define PREFIX ""
#else // all other Unix
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index c65f6645d01..4fbaed0d7b3 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -2988,6 +2988,10 @@ void tst_QAccessibility::listTest()
model->appendRow({new QStandardItem("Norway"), new QStandardItem("Oslo"), new QStandardItem("NOK")});
model->appendRow({new QStandardItem("Germany"), new QStandardItem("Berlin"), new QStandardItem("EUR")});
model->appendRow({new QStandardItem("Australia"), new QStandardItem("Brisbane"), new QStandardItem("AUD")});
+ model->item(0, 1)->setCheckable(true);
+ model->item(1, 1)->setCheckable(true);
+ model->item(2, 1)->setCheckable(true);
+ model->item(2, 1)->setCheckState(Qt::Checked);
auto lvHolder = std::make_unique<QListView>();
auto listView = lvHolder.get();
listView->setModel(model);
@@ -3016,16 +3020,19 @@ void tst_QAccessibility::listTest()
QCOMPARE(iface->indexOfChild(child1), 0);
QCOMPARE(child1->text(QAccessible::Name), QString("Oslo"));
QCOMPARE(child1->role(), QAccessible::ListItem);
+ QVERIFY(child1->state().checkable);
QAccessibleInterface *child2 = iface->child(1);
QVERIFY(child2);
QCOMPARE(iface->indexOfChild(child2), 1);
QCOMPARE(child2->text(QAccessible::Name), QString("Berlin"));
+ QVERIFY(child2->state().checkable);
QAccessibleInterface *child3 = iface->child(2);
QVERIFY(child3);
QCOMPARE(iface->indexOfChild(child3), 2);
QCOMPARE(child3->text(QAccessible::Name), QString("Brisbane"));
+ QVERIFY(child3->state().checkable);
}
// Check that application is accessible parent, since it's a top-level widget
@@ -3044,9 +3051,21 @@ void tst_QAccessibility::listTest()
// skip focus event tests on platforms where window focus cannot be ensured
const bool checkFocus = QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation);
if (checkFocus) {
+ QVERIFY(QTest::qWaitForWindowActive(listView));
+
QAccessibleEvent focusEvent(listView, QAccessible::Focus);
focusEvent.setChild(1);
QVERIFY(QTestAccessibility::containsEvent(&focusEvent));
+
+ // check the item
+ QVERIFY(!iface->child(1)->state().checked);
+ QTest::keyClick(listView, Qt::Key_Space);
+ QVERIFY(iface->child(1)->state().checked);
+ QAccessible::State s;
+ s.checked = true;
+ QAccessibleStateChangeEvent checkedStateChangedEvent(listView, s);
+ checkedStateChangedEvent.setChild(1);
+ QVERIFY(QTestAccessibility::containsEvent(&checkedStateChangedEvent));
}
QTest::mouseClick(listView->viewport(), Qt::LeftButton, { }, listView->visualRect(model->index(2, listView->modelColumn())).center());
@@ -3058,6 +3077,16 @@ void tst_QAccessibility::listTest()
QAccessibleEvent focusEvent2(listView, QAccessible::Focus);
focusEvent2.setChild(2);
QVERIFY(QTestAccessibility::containsEvent(&focusEvent2));
+
+ // uncheck the item
+ QVERIFY(iface->child(2)->state().checked);
+ QTest::keyClick(listView, Qt::Key_Space);
+ QVERIFY(!iface->child(2)->state().checked);
+ QAccessible::State s;
+ s.checked = true;
+ QAccessibleStateChangeEvent checkedStateChangedEvent(listView, s);
+ checkedStateChangedEvent.setChild(2);
+ QVERIFY(QTestAccessibility::containsEvent(&checkedStateChangedEvent));
}
QAccessibleTableInterface *table = iface->tableInterface();
@@ -3174,6 +3203,7 @@ void tst_QAccessibility::treeTest()
QTreeWidgetItem *item1 = new QTreeWidgetItem;
item1->setText(0, "Picasso");
item1->setText(1, "Guernica");
+ item1->setCheckState(0, Qt::Unchecked);
root1->addChild(item1);
QTreeWidgetItem *item2 = new QTreeWidgetItem;
@@ -3188,6 +3218,7 @@ void tst_QAccessibility::treeTest()
QTreeWidgetItem *item3 = new QTreeWidgetItem;
item3->setText(0, "Klimt");
item3->setText(1, "The Kiss");
+ item3->setCheckState(0, Qt::Checked);
root2->addChild(item3);
treeView->resize(400,400);
@@ -3291,6 +3322,40 @@ void tst_QAccessibility::treeTest()
QCOMPARE(table2->columnDescription(0), QString("Artist"));
QCOMPARE(table2->columnDescription(1), QString("Work"));
+ // skip accessible state change event tests on platforms where window focus cannot be ensured
+ if (QGuiApplicationPrivate::platformIntegration()->hasCapability(
+ QPlatformIntegration::WindowActivation)) {
+ QVERIFY(QTest::qWaitForWindowActive(treeView.get()));
+
+ // check item1 (Picasso)
+ QVERIFY(cell1->state().checkable);
+ QVERIFY(!cell1->state().checked);
+ treeView->setCurrentItem(item1);
+ QTest::keyClick(treeView.get(), Qt::Key_Space);
+ QVERIFY(cell1->state().checked);
+ {
+ QAccessible::State s;
+ s.checked = true;
+ QAccessibleStateChangeEvent checkedStateChangedEvent(treeView.get(), s);
+ checkedStateChangedEvent.setChild(iface->indexOfChild(cell1));
+ QVERIFY(QTestAccessibility::containsEvent(&checkedStateChangedEvent));
+ }
+
+ // uncheck item3 (Klimt)
+ QVERIFY(cell2->state().checkable);
+ QVERIFY(cell2->state().checked);
+ treeView->setCurrentItem(item3);
+ QTest::keyClick(treeView.get(), Qt::Key_Space);
+ QVERIFY(!cell2->state().checked);
+ {
+ QAccessible::State s;
+ s.checked = true;
+ QAccessibleStateChangeEvent checkedStateChangedEvent(treeView.get(), s);
+ checkedStateChangedEvent.setChild(iface->indexOfChild(cell2));
+ QVERIFY(QTestAccessibility::containsEvent(&checkedStateChangedEvent));
+ }
+ }
+
QTestAccessibility::clearEvents();
}
@@ -3315,6 +3380,7 @@ void tst_QAccessibility::tableTest()
for (int i = 0; i<9; ++i) {
QTableWidgetItem *item = new QTableWidgetItem;
item->setText(QString::number(i/3) + QString(".") + QString::number(i%3));
+ item->setCheckState(Qt::Unchecked);
tableView->setItem(i/3, i%3, item);
}
@@ -3582,6 +3648,40 @@ void tst_QAccessibility::tableTest()
tableView->horizontalHeader()->setVisible(false);
}
+
+ // skip accessible state change event tests on platforms where window focus cannot be ensured
+ if (QGuiApplicationPrivate::platformIntegration()->hasCapability(
+ QPlatformIntegration::WindowActivation)) {
+ QVERIFY(QTest::qWaitForWindowActive(tableView));
+
+ // check cell (0, 0)
+ tableView->setCurrentItem(tableView->item(0, 0));
+ QVERIFY(cell00->state().checkable);
+ QVERIFY(!cell00->state().checked);
+ QTest::keyClick(tableView, Qt::Key_Space);
+ QVERIFY(cell00->state().checked);
+ {
+ QAccessible::State s;
+ s.checked = true;
+ QAccessibleStateChangeEvent checkedStateChangedEvent(tableView, s);
+ checkedStateChangedEvent.setChild(iface->indexOfChild(cell00));
+ QVERIFY(QTestAccessibility::containsEvent(&checkedStateChangedEvent));
+ }
+
+ QTestAccessibility::clearEvents();
+
+ // uncheck cell (0, 0) again
+ QTest::keyClick(tableView, Qt::Key_Space);
+ QVERIFY(!cell00->state().checked);
+ {
+ QAccessible::State s;
+ s.checked = true;
+ QAccessibleStateChangeEvent checkedStateChangedEvent(tableView, s);
+ checkedStateChangedEvent.setChild(iface->indexOfChild(cell00));
+ QVERIFY(QTestAccessibility::containsEvent(&checkedStateChangedEvent));
+ }
+ }
+
{
QTestAccessibility::clearEvents();
auto cell0 = table2->cellAt(0, 2);
diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
index 10a67daa02a..0f8a6da823e 100644
--- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
+++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
@@ -3572,6 +3572,7 @@ void tst_QComboBox::popupPositionAfterStyleChange()
QFrame *container = box.findChild<QComboBoxPrivateContainer *>();
QVERIFY(container);
QVERIFY(QTest::qWaitForWindowExposed(container));
+ container->resize(80, 80);
// Select the last menu item, which will close the popup. This item is then expected
// to be centered on top of the combobox the next time the popup opens.
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index 1f57ae43fae..50e8646499d 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -127,6 +127,7 @@ private slots:
#endif
void invisibleActions();
+ void execReturnsWidgetAction();
protected slots:
void onActivated(QAction*);
@@ -2335,5 +2336,26 @@ void tst_QMenu::dontSelectDisabledActionByShortcut()
}
#endif
+void tst_QMenu::execReturnsWidgetAction()
+{
+ QWidget window;
+
+ QMenu menu(&window);
+ QWidgetAction *widgetAction = new QWidgetAction(&menu);
+ QPushButton *menuButton = new QPushButton("Button", &menu);
+ widgetAction->setDefaultWidget(menuButton);
+ QObject::connect(menuButton, &QPushButton::clicked, widgetAction, &QAction::trigger);
+
+ menu.addAction("First");
+ menu.addAction(widgetAction);
+ menu.addAction("Last");
+
+ window.show();
+ QVERIFY(QTest::qWaitForWindowActive(&window));
+
+ QTimer::singleShot(0, menuButton, &QPushButton::click);
+ QCOMPARE(menu.exec(window.geometry().center()), widgetAction);
+}
+
QTEST_MAIN(tst_QMenu)
#include "tst_qmenu.moc"
diff --git a/tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp b/tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp
index 02fe3f986e9..54ba45c1256 100644
--- a/tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp
+++ b/tests/benchmarks/gui/painting/qcolor/tst_qcolor.cpp
@@ -2,8 +2,24 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <qtest.h>
+
#include <QColor>
+#include <vector>
+
+static std::vector<QColor> all_rgb_colors()
+{
+ std::vector<QColor> colors;
+ colors.reserve(256 * 256 * 256);
+ for (int r = 0; r < 256; ++r) {
+ for (int g = 0; g < 256; ++g) {
+ for (int b = 0; b < 256; ++b)
+ colors.emplace_back(r, g, b);
+ }
+ }
+ return colors;
+}
+
class tst_QColor : public QObject
{
@@ -12,6 +28,11 @@ class tst_QColor : public QObject
private slots:
void nameRgb();
void nameArgb();
+ void toHsl();
+ void toHsv();
+
+private:
+ const std::vector<QColor> m_all_rgb = all_rgb_colors();
};
void tst_QColor::nameRgb()
@@ -32,6 +53,22 @@ void tst_QColor::nameArgb()
}
}
+void tst_QColor::toHsl()
+{
+ QBENCHMARK {
+ for (const QColor &c : m_all_rgb)
+ [[maybe_unused]] const auto r = c.toHsl();
+ }
+}
+
+void tst_QColor::toHsv()
+{
+ QBENCHMARK {
+ for (const QColor &c : m_all_rgb)
+ [[maybe_unused]] const auto r = c.toHsv();
+ }
+}
+
QTEST_MAIN(tst_QColor)
#include "tst_qcolor.moc"