From a8bcf68a5ec91b4ca4209c36310def145c8afe97 Mon Sep 17 00:00:00 2001 From: Ivan Solovev Date: Wed, 7 Jul 2021 14:22:13 +0200 Subject: [PATCH] Fix QMultiHash::keys(const T&) overload The method was never tested, but it failed to compile after QMultiHash was introduced as a separate class in 6.0. This patch fixes it and adds some unit-tests to cover the case. Task-number: QTBUG-91736 Pick-to: 6.2 6.1 Change-Id: I5dd989d4775efc6a9bb13c5ed1d892e499d95dc2 Reviewed-by: Lars Knoll Reviewed-by: Edward Welbourne --- src/corelib/tools/qhash.h | 2 +- tests/auto/corelib/tools/qhash/tst_qhash.cpp | 65 +++++++++++++++++--- 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index 6866dfebf3..b030fd2a93 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -1458,7 +1458,7 @@ public: QList res; const_iterator i = begin(); while (i != end()) { - if (i.value()->contains(value)) + if (i.value() == value) res.append(i.key()); ++i; } diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp index 375f9048c0..cd25f417d9 100644 --- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp +++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp @@ -44,6 +44,7 @@ private slots: void erase(); void erase_edge_case(); void key(); + void keys(); void swap(); void count(); // copied from tst_QMap @@ -620,6 +621,62 @@ void tst_QHash::key() QCOMPARE(hash2.key("zero"), 0); QCOMPARE(hash2.key("zero", def), 0); } + + { + const int def = -1; + QMultiHash hash; + QCOMPARE(hash.key("val"), 0); + QCOMPARE(hash.key("val", def), def); + QVERIFY(!hash.isDetached()); + + hash.insert(1, "value1"); + hash.insert(1, "value2"); + hash.insert(2, "value1"); + + QCOMPARE(hash.key("value2"), 1); + const auto key = hash.key("value1"); + QVERIFY(key == 1 || key == 2); + QCOMPARE(hash.key("value"), 0); + QCOMPARE(hash.key("value", def), def); + } +} + +template +QList sorted(const QList &list) +{ + QList res = list; + std::sort(res.begin(), res.end()); + return res; +} + +void tst_QHash::keys() +{ + { + QHash hash; + QVERIFY(hash.keys().isEmpty()); + QVERIFY(hash.keys(1).isEmpty()); + QVERIFY(!hash.isDetached()); + + hash.insert("key1", 1); + hash.insert("key2", 2); + hash.insert("key3", 1); + + QCOMPARE(sorted(hash.keys()), QStringList({ "key1", "key2", "key3" })); + QCOMPARE(sorted(hash.keys(1)), QStringList({ "key1", "key3" })); + } + { + QMultiHash hash; + QVERIFY(hash.keys().isEmpty()); + QVERIFY(hash.keys(1).isEmpty()); + QVERIFY(!hash.isDetached()); + + hash.insert("key1", 1); + hash.insert("key2", 1); + hash.insert("key1", 2); + + QCOMPARE(sorted(hash.keys()), QStringList({ "key1", "key1", "key2" })); + QCOMPARE(sorted(hash.keys(1)), QStringList({ "key1", "key2" })); + } } void tst_QHash::swap() @@ -1484,14 +1541,6 @@ void tst_QHash::qmultihash_qhash_rvalue_ref_unite() } } -template -QList sorted(const QList &list) -{ - QList res = list; - std::sort(res.begin(), res.end()); - return res; -} - void tst_QHash::keys_values_uniqueKeys() { QMultiHash hash;