summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-05-07 13:07:34 +0200
committerLiang Qi <liang.qi@qt.io>2017-05-07 13:08:18 +0200
commitd1ea4813458b383e66ce4df69d1833b8b6a279c4 (patch)
tree3bdc16da993e5de56b669e6774fb0748075ddd90 /tests/auto/corelib
parent1c87d4e1a1d0e1972f6dc85e55ea9be8a42797ba (diff)
parent0b1ec78c2d4871afcc89d5b046926b88f0819a7c (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Conflicts: src/network/access/qnetworkreply.cpp tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp Change-Id: Iadf766269454087e69fb216fc3857d85b0ddfaad
Diffstat (limited to 'tests/auto/corelib')
-rw-r--r--tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST2
-rw-r--r--tests/auto/corelib/global/qflags/tst_qflags.cpp18
-rw-r--r--tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp26
-rw-r--r--tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro2
-rw-r--r--tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp16
-rw-r--r--tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro2
-rw-r--r--tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp8
-rw-r--r--tests/auto/corelib/io/qurlinternal/tst_qurlinternal.cpp33
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp29
-rw-r--r--tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp5
-rw-r--r--tests/auto/corelib/thread/qsemaphore/BLACKLIST1
-rw-r--r--tests/auto/corelib/tools/qhash/tst_qhash.cpp69
12 files changed, 182 insertions, 29 deletions
diff --git a/tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST b/tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST
index 36b777de34..391e3f67af 100644
--- a/tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST
+++ b/tests/auto/corelib/animation/qsequentialanimationgroup/BLACKLIST
@@ -2,4 +2,4 @@
windows
[finishWithUncontrolledAnimation]
windows
-macos-10.12
+osx-10.12
diff --git a/tests/auto/corelib/global/qflags/tst_qflags.cpp b/tests/auto/corelib/global/qflags/tst_qflags.cpp
index d70b099fe3..7dd1a1be01 100644
--- a/tests/auto/corelib/global/qflags/tst_qflags.cpp
+++ b/tests/auto/corelib/global/qflags/tst_qflags.cpp
@@ -111,19 +111,19 @@ void tst_QFlags::constExpr()
default: QVERIFY(false);
}
- QVERIFY(verifyConstExpr<(Qt::LeftButton | Qt::RightButton) & Qt::LeftButton>(Qt::LeftButton));
- QVERIFY(verifyConstExpr<(Qt::LeftButton | Qt::RightButton) & Qt::MiddleButton>(0));
- QVERIFY(verifyConstExpr<(Qt::LeftButton | Qt::RightButton) | Qt::MiddleButton>(Qt::LeftButton | Qt::RightButton | Qt::MiddleButton));
- QVERIFY(verifyConstExpr<~(Qt::LeftButton | Qt::RightButton)>(~(Qt::LeftButton | Qt::RightButton)));
- QVERIFY(verifyConstExpr<Qt::MouseButtons(Qt::LeftButton) ^ Qt::RightButton>(Qt::LeftButton ^ Qt::RightButton));
- QVERIFY(verifyConstExpr<Qt::MouseButtons(0)>(0));
- QVERIFY(verifyConstExpr<Qt::MouseButtons(Qt::RightButton) & 0xff>(Qt::RightButton));
- QVERIFY(verifyConstExpr<Qt::MouseButtons(Qt::RightButton) | 0xff>(0xff));
+ QVERIFY(verifyConstExpr<uint((Qt::LeftButton | Qt::RightButton) & Qt::LeftButton)>(Qt::LeftButton));
+ QVERIFY(verifyConstExpr<uint((Qt::LeftButton | Qt::RightButton) & Qt::MiddleButton)>(0));
+ QVERIFY(verifyConstExpr<uint((Qt::LeftButton | Qt::RightButton) | Qt::MiddleButton)>(Qt::LeftButton | Qt::RightButton | Qt::MiddleButton));
+ QVERIFY(verifyConstExpr<uint(~(Qt::LeftButton | Qt::RightButton))>(~(Qt::LeftButton | Qt::RightButton)));
+ QVERIFY(verifyConstExpr<uint(Qt::MouseButtons(Qt::LeftButton) ^ Qt::RightButton)>(Qt::LeftButton ^ Qt::RightButton));
+ QVERIFY(verifyConstExpr<uint(Qt::MouseButtons(0))>(0));
+ QVERIFY(verifyConstExpr<uint(Qt::MouseButtons(Qt::RightButton) & 0xff)>(Qt::RightButton));
+ QVERIFY(verifyConstExpr<uint(Qt::MouseButtons(Qt::RightButton) | 0xff)>(0xff));
QVERIFY(!verifyConstExpr<Qt::RightButton>(!Qt::MouseButtons(Qt::LeftButton)));
#if defined(__cpp_constexpr) && __cpp_constexpr-0 >= 201304
- QVERIFY(verifyConstExpr<testRelaxedConstExpr()>(Qt::MiddleButton));
+ QVERIFY(verifyConstExpr<uint(testRelaxedConstExpr())>(Qt::MiddleButton));
#endif
#endif
}
diff --git a/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp b/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp
index 0a74dc64c0..1643eed3d2 100644
--- a/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp
+++ b/tests/auto/corelib/io/qloggingregistry/tst_qloggingregistry.cpp
@@ -202,18 +202,15 @@ private slots:
QLoggingRegistry registry;
registry.init();
- QCOMPARE(registry.apiRules.size(), 0);
- QCOMPARE(registry.configRules.size(), 0);
- QCOMPARE(registry.envRules.size(), 1);
-
- QCOMPARE(registry.rules.size(), 1);
+ QCOMPARE(registry.ruleSets[QLoggingRegistry::ApiRules].size(), 0);
+ QCOMPARE(registry.ruleSets[QLoggingRegistry::ConfigRules].size(), 0);
+ QCOMPARE(registry.ruleSets[QLoggingRegistry::EnvironmentRules].size(), 1);
// check that QT_LOGGING_RULES take precedence
qputenv("QT_LOGGING_RULES", "Digia.*=true");
registry.init();
- QCOMPARE(registry.envRules.size(), 2);
- QCOMPARE(registry.envRules.at(1).enabled, true);
- QCOMPARE(registry.rules.size(), 2);
+ QCOMPARE(registry.ruleSets[QLoggingRegistry::EnvironmentRules].size(), 2);
+ QCOMPARE(registry.ruleSets[QLoggingRegistry::EnvironmentRules].at(1).enabled, true);
}
void QLoggingRegistry_config()
@@ -238,7 +235,7 @@ private slots:
QLoggingRegistry registry;
registry.init();
- QCOMPARE(registry.configRules.size(), 1);
+ QCOMPARE(registry.ruleSets[QLoggingRegistry::ConfigRules].size(), 1);
// remove file again
QVERIFY(file.remove());
@@ -260,10 +257,9 @@ private slots:
QLoggingRegistry *registry = QLoggingRegistry::instance();
// empty all rules , check default
- registry->rules.clear();
- registry->apiRules.clear();
- registry->configRules.clear();
- registry->envRules.clear();
+ registry->ruleSets[QLoggingRegistry::ApiRules].clear();
+ registry->ruleSets[QLoggingRegistry::ConfigRules].clear();
+ registry->ruleSets[QLoggingRegistry::EnvironmentRules].clear();
registry->updateRules();
QVERIFY(cat.isWarningEnabled());
@@ -271,7 +267,7 @@ private slots:
// set Config rule
QLoggingSettingsParser parser;
parser.setContent("[Rules]\nDigia.*=false");
- registry->configRules=parser.rules();
+ registry->ruleSets[QLoggingRegistry::ConfigRules] = parser.rules();
registry->updateRules();
QVERIFY(!cat.isWarningEnabled());
@@ -283,7 +279,7 @@ private slots:
// set Env rule, should overwrite Config one
parser.setContent("Digia.*=false");
- registry->envRules=parser.rules();
+ registry->ruleSets[QLoggingRegistry::EnvironmentRules] = parser.rules();
registry->updateRules();
QVERIFY(!cat.isWarningEnabled());
diff --git a/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro b/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
index c72d9e4fad..9fd7047405 100644
--- a/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
+++ b/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
@@ -1,5 +1,7 @@
CONFIG += testcase
TARGET = tst_qstandardpaths
QT = core testlib
+INCLUDEPATH += ../../../../shared/
+HEADERS += ../../../../shared/emulationdetector.h
SOURCES = tst_qstandardpaths.cpp
TESTDATA += tst_qstandardpaths.cpp qstandardpaths.pro
diff --git a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
index 0a00e00d83..3de777653e 100644
--- a/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
+++ b/tests/auto/corelib/io/qstandardpaths/tst_qstandardpaths.cpp
@@ -46,6 +46,8 @@
#define Q_XDG_PLATFORM
#endif
+#include "emulationdetector.h"
+
// Update this when adding new enum values; update enumNames too
static const int MaxStandardLocation = QStandardPaths::AppConfigLocation;
@@ -485,14 +487,24 @@ void tst_qstandardpaths::testCustomRuntimeDirectory()
EnvVarRestorer restorer;
// When $XDG_RUNTIME_DIR points to a directory with wrong ownership, QStandardPaths should warn
- qputenv("XDG_RUNTIME_DIR", QFile::encodeName("/tmp"));
+ QByteArray rootOwnedFileName = "/tmp";
+ if (EmulationDetector::isRunningArmOnX86()) {
+ // Directory "tmp" under toolchain sysroot is detected by qemu and has same uid as current user.
+ // Try /opt instead, it might not be located in the sysroot.
+ QFileInfo rootOwnedFile = QFileInfo(QString::fromLatin1(rootOwnedFileName));
+ if (rootOwnedFile.ownerId() == ::geteuid()) {
+ rootOwnedFileName = "/opt";
+ }
+ }
+ qputenv("XDG_RUNTIME_DIR", QFile::encodeName(rootOwnedFileName));
+
// It's very unlikely that /tmp is 0600 or that we can chmod it
// The call below outputs
// "QStandardPaths: wrong ownership on runtime directory /tmp, 0 instead of $UID"
// but we can't reliably expect that it's owned by uid 0, I think.
const uid_t uid = geteuid();
QTest::ignoreMessage(QtWarningMsg,
- qPrintable(QString::fromLatin1("QStandardPaths: wrong ownership on runtime directory /tmp, 0 instead of %1").arg(uid)));
+ qPrintable(QString::fromLatin1("QStandardPaths: wrong ownership on runtime directory " + rootOwnedFileName + ", 0 instead of %1").arg(uid)));
const QString runtimeDir = QStandardPaths::writableLocation(QStandardPaths::RuntimeLocation);
QVERIFY2(runtimeDir.isEmpty(), qPrintable(runtimeDir));
diff --git a/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro b/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
index 4a69971f78..351e263093 100644
--- a/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
+++ b/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
@@ -1,5 +1,7 @@
CONFIG += testcase
TARGET = tst_qtemporarydir
SOURCES += tst_qtemporarydir.cpp
+INCLUDEPATH += ../../../../shared/
+HEADERS += ../../../../shared/emulationdetector.h
QT = core testlib
diff --git a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp
index 758bbead84..4bed8d0fd6 100644
--- a/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp
+++ b/tests/auto/corelib/io/qtemporarydir/tst_qtemporarydir.cpp
@@ -42,6 +42,7 @@
# include <sys/types.h>
# include <unistd.h>
#endif
+#include "emulationdetector.h"
class tst_QTemporaryDir : public QObject
{
@@ -316,6 +317,13 @@ void tst_QTemporaryDir::nonWritableCurrentDir()
const QFileInfo nonWritableDirFi = QFileInfo(QLatin1String(nonWritableDir));
QVERIFY(nonWritableDirFi.isDir());
+
+ if (EmulationDetector::isRunningArmOnX86()) {
+ if (nonWritableDirFi.ownerId() == ::geteuid()) {
+ QSKIP("Sysroot directories are owned by the current user");
+ }
+ }
+
QVERIFY(!nonWritableDirFi.isWritable());
ChdirOnReturn cor(QDir::currentPath());
diff --git a/tests/auto/corelib/io/qurlinternal/tst_qurlinternal.cpp b/tests/auto/corelib/io/qurlinternal/tst_qurlinternal.cpp
index f5835ec5f4..bcf6d6c32b 100644
--- a/tests/auto/corelib/io/qurlinternal/tst_qurlinternal.cpp
+++ b/tests/auto/corelib/io/qurlinternal/tst_qurlinternal.cpp
@@ -650,6 +650,31 @@ void tst_QUrlInternal::ace_testsuite_data()
<< "xn--djrptm67aikb.xn--kpry57d"
<< "."
<< taiwaneseIDN;
+
+ // violations / invalids
+ QTest::newRow("invalid-punycode") << "xn--z" << "xn--z" << "xn--z" << "xn--z";
+
+ // U+00A0 NO-BREAK SPACE encodes to Punycode "6a"
+ // but it is prohibited and should have caused encoding failure
+ QTest::newRow("invalid-nameprep-prohibited") << "xn--6a" << "xn--6a" << "xn--6a" << "xn--6a";
+
+ // U+00AD SOFT HYPHEN between "a" and "b" encodes to Punycode "ab-5da"
+ // but it should have been removed in the nameprep stage
+ QTest::newRow("invalid-nameprep-maptonothing") << "xn-ab-5da" << "xn-ab-5da" << "xn-ab-5da" << "xn-ab-5da";
+
+ // U+00C1 LATIN CAPITAL LETTER A WITH ACUTE encodes to Punycode "4ba"
+ // but it should have nameprepped to lowercase first
+ QTest::newRow("invalid-nameprep-uppercase") << "xn--4ba" << "xn--4ba" << "xn--4ba" << "xn--4ba";
+
+ // U+00B5 MICRO SIGN encodes to Punycode "sba"
+ // but is should have nameprepped to NFKC U+03BC GREEK SMALL LETTER MU
+ QTest::newRow("invalid-nameprep-nonnfkc") << "xn--sba" << "xn--sba" << "xn--sba" << "xn--sba";
+
+ // U+04CF CYRILLIC SMALL LETTER PALOCHKA encodes to "s5a"
+ // but it's not in RFC 3454's allowed character list (Unicode 3.2)
+ QTest::newRow("invalid-nameprep-unassigned") << "xn--s5a" << "xn--s5a" << "xn--s5a" << "xn--s5a";
+ // same character, see QTBUG-60364
+ QTest::newRow("invalid-nameprep-unassigned2") << "xn--80ak6aa92e" << "xn--80ak6aa92e" << "xn--80ak6aa92e" << "xn--80ak6aa92e";
}
void tst_QUrlInternal::ace_testsuite()
@@ -670,6 +695,14 @@ void tst_QUrlInternal::ace_testsuite()
QCOMPARE(QUrl::fromAce(domain.toLatin1()), fromace + suffix);
QCOMPARE(QUrl::fromAce(QUrl::toAce(domain)), unicode + suffix);
+ QUrl u;
+ u.setHost(domain);
+ QVERIFY(u.isValid());
+ QCOMPARE(u.host(), unicode + suffix);
+ QCOMPARE(u.host(QUrl::EncodeUnicode), toace + suffix);
+ QCOMPARE(u.toEncoded(), "//" + toace.toLatin1() + suffix);
+ QCOMPARE(u.toDisplayString(), "//" + unicode + suffix);
+
domain = in + (suffix ? ".troll.No" : "");
QCOMPARE(QString::fromLatin1(QUrl::toAce(domain)), toace + suffix);
if (fromace != ".")
diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
index 14c1b29836..c884edde04 100644
--- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
+++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
@@ -209,6 +209,7 @@ private slots:
void invokeMetaConstructor();
void invokeTypedefTypes();
void invokeException();
+ void invokeQueuedAutoRegister();
void qtMetaObjectInheritance();
void normalizedSignature_data();
void normalizedSignature();
@@ -380,6 +381,7 @@ class QtTestObject: public QObject
public:
QtTestObject();
+ QtTestObject(const QString &s) : slotResult(s) {}
Q_INVOKABLE QtTestObject(QObject *parent);
public slots:
@@ -419,6 +421,15 @@ public slots:
return s2;
}
+ void slotWithRegistrableArgument(QtTestObject *o1, QPointer<QtTestObject> o2,
+ QSharedPointer<QtTestObject> o3, QWeakPointer<QtTestObject> o4,
+ QVector<QtTestObject *> o5, QList<QtTestObject *> o6)
+ {
+ slotResult = QLatin1String("slotWithRegistrableArgument:") + o1->slotResult + o2->slotResult
+ + o3->slotResult + o4.data()->slotResult + QString::number(o5.size())
+ + QString::number(o6.size());
+ }
+
public:
static void staticFunction0();
static qint64 staticFunction1();
@@ -1114,6 +1125,24 @@ void tst_QMetaObject::invokeException()
#endif
}
+void tst_QMetaObject::invokeQueuedAutoRegister()
+{
+ QtTestObject obj;
+
+ auto shared = QSharedPointer<QtTestObject>::create(QStringLiteral("myShared-"));
+
+ QVERIFY(QMetaObject::invokeMethod(
+ &obj, "slotWithRegistrableArgument", Qt::QueuedConnection,
+ Q_ARG(QtTestObject *, shared.data()), Q_ARG(QPointer<QtTestObject>, shared.data()),
+ Q_ARG(QSharedPointer<QtTestObject>, shared), Q_ARG(QWeakPointer<QtTestObject>, shared),
+ Q_ARG(QVector<QtTestObject *>, QVector<QtTestObject *>()),
+ Q_ARG(QList<QtTestObject *>, QList<QtTestObject *>())));
+ QVERIFY(obj.slotResult.isEmpty());
+ qApp->processEvents(QEventLoop::AllEvents);
+ QCOMPARE(obj.slotResult,
+ QString("slotWithRegistrableArgument:myShared-myShared-myShared-myShared-00"));
+}
+
void tst_QMetaObject::normalizedSignature_data()
{
QTest::addColumn<QString>("signature");
diff --git a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
index 1598382959..a52b80170f 100644
--- a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
+++ b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
@@ -360,11 +360,16 @@ void tst_QSocketNotifier::asyncMultipleDatagram()
QSignalSpy spy(m_asyncReceiver, &QIODevice::readyRead);
connect(m_asyncReceiver, &QIODevice::readyRead, this,
&tst_QSocketNotifier::async_readDatagramSlot);
+
+ // activate socket notifiers
+ QTestEventLoop::instance().enterLoopMSecs(100);
+
m_asyncSender->writeDatagram("1", makeNonAny(m_asyncReceiver->localAddress()), port);
m_asyncSender->writeDatagram("2", makeNonAny(m_asyncReceiver->localAddress()), port);
// wait a little to ensure that the datagrams we've just sent
// will be delivered on receiver side.
QTest::qSleep(100);
+ QVERIFY(m_asyncReceiver->hasPendingDatagrams());
QTimer::singleShot(500, this, &tst_QSocketNotifier::async_writeDatagramSlot);
diff --git a/tests/auto/corelib/thread/qsemaphore/BLACKLIST b/tests/auto/corelib/thread/qsemaphore/BLACKLIST
index 06ae815f29..c198b90253 100644
--- a/tests/auto/corelib/thread/qsemaphore/BLACKLIST
+++ b/tests/auto/corelib/thread/qsemaphore/BLACKLIST
@@ -1,4 +1,5 @@
[tryAcquireWithTimeout:0.2s]
windows
+osx-10.12
[tryAcquireWithTimeout:2s]
windows
diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
index c34bee64b1..0015efacfa 100644
--- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp
+++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
@@ -51,7 +51,7 @@ private slots:
void contains(); // copied from tst_QMap
void qhash();
void take(); // copied from tst_QMap
- void operator_eq(); // copied from tst_QMap
+ void operator_eq(); // slightly modified from tst_QMap
void rehash_isnt_quadratic();
void dont_need_default_constructor();
void qmultihash_specific();
@@ -772,7 +772,7 @@ void tst_QHash::take()
QVERIFY(!map.contains(3));
}
-//copied from tst_QMap
+// slightly modified from tst_QMap
void tst_QHash::operator_eq()
{
{
@@ -849,6 +849,71 @@ void tst_QHash::operator_eq()
QVERIFY(a != b);
QVERIFY(!(a == b));
}
+
+ // unlike multi-maps, multi-hashes should be equal iff their contents are equal,
+ // regardless of insertion or iteration order
+
+ {
+ QHash<int, int> a;
+ QHash<int, int> b;
+
+ a.insertMulti(0, 0);
+ a.insertMulti(0, 1);
+
+ b.insertMulti(0, 1);
+ b.insertMulti(0, 0);
+
+ QVERIFY(a == b);
+ QVERIFY(!(a != b));
+ }
+
+ {
+ QHash<int, int> a;
+ QHash<int, int> b;
+
+ enum { Count = 100 };
+
+ for (int key = 0; key < Count; ++key) {
+ for (int value = 0; value < Count; ++value)
+ a.insertMulti(key, value);
+ }
+
+ for (int key = Count - 1; key >= 0; --key) {
+ for (int value = 0; value < Count; ++value)
+ b.insertMulti(key, value);
+ }
+
+ QVERIFY(a == b);
+ QVERIFY(!(a != b));
+ }
+
+ {
+ QHash<int, int> a;
+ QHash<int, int> b;
+
+ enum {
+ Count = 100,
+ KeyStep = 17, // coprime with Count
+ ValueStep = 23, // coprime with Count
+ };
+
+ for (int key = 0; key < Count; ++key) {
+ for (int value = 0; value < Count; ++value)
+ a.insertMulti(key, value);
+ }
+
+ // Generates two permutations of [0, Count) for the keys and values,
+ // so that b will be identical to a, just built in a very different order.
+
+ for (int k = 0; k < Count; ++k) {
+ const int key = (k * KeyStep) % Count;
+ for (int v = 0; v < Count; ++v)
+ b.insertMulti(key, (v * ValueStep) % Count);
+ }
+
+ QVERIFY(a == b);
+ QVERIFY(!(a != b));
+ }
}
void tst_QHash::compare()