summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp7
-rw-r--r--tests/auto/corelib/serialization/cborlargedatavalidation.cpp134
-rw-r--r--tests/auto/corelib/serialization/qcborstreamreader/qcborstreamreader.pro2
-rw-r--r--tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp49
-rw-r--r--tests/auto/corelib/serialization/qcborvalue/qcborvalue.pro2
-rw-r--r--tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp122
-rw-r--r--tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp162
-rw-r--r--tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp82
-rw-r--r--tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp16
-rw-r--r--tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp58
-rw-r--r--tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp10
-rw-r--r--tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp157
-rw-r--r--tests/auto/widgets/util/qscroller/tst_qscroller.cpp157
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp2
-rw-r--r--tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro5
-rw-r--r--tests/benchmarks/corelib/io/qdir/10000/10000.pro6
-rw-r--r--tests/benchmarks/corelib/io/qdir/tree/tree.pro6
-rw-r--r--tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro6
-rw-r--r--tests/benchmarks/corelib/io/qfile/qfile.pro3
-rw-r--r--tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro6
-rw-r--r--tests/benchmarks/corelib/io/qiodevice/qiodevice.pro6
-rw-r--r--tests/benchmarks/corelib/io/qprocess/test/test.pro5
-rw-r--r--tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro4
-rw-r--r--tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro6
-rw-r--r--tests/benchmarks/corelib/io/qtextstream/qtextstream.pro6
-rw-r--r--tests/benchmarks/corelib/io/qurl/qurl.pro3
-rw-r--r--tests/benchmarks/corelib/json/json.pro3
-rw-r--r--tests/benchmarks/corelib/kernel/events/events.pro4
-rw-r--r--tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro4
-rw-r--r--tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro3
-rw-r--r--tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro6
-rw-r--r--tests/benchmarks/corelib/kernel/qobject/qobject.pro4
-rw-r--r--tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro11
-rw-r--r--tests/benchmarks/corelib/kernel/qvariant/qvariant.pro7
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro2
-rw-r--r--tests/benchmarks/corelib/plugin/quuid/quuid.pro5
-rw-r--r--tests/benchmarks/corelib/text/qbytearray/qbytearray.pro6
-rw-r--r--tests/benchmarks/corelib/text/qchar/qchar.pro4
-rw-r--r--tests/benchmarks/corelib/text/qlocale/qlocale.pro3
-rw-r--r--tests/benchmarks/corelib/text/qregexp/qregexp.pro6
-rw-r--r--tests/benchmarks/corelib/text/qstring/qstring.pro5
-rw-r--r--tests/benchmarks/corelib/text/qstringbuilder/qstringbuilder.pro10
-rw-r--r--tests/benchmarks/corelib/text/qstringlist/qstringlist.pro6
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/qmutex.pro5
-rw-r--r--tests/benchmarks/corelib/thread/qreadwritelock/qreadwritelock.pro7
-rw-r--r--tests/benchmarks/corelib/thread/qthreadpool/qthreadpool.pro5
-rw-r--r--tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro5
-rw-r--r--tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro4
-rw-r--r--tests/benchmarks/corelib/time/qdate/qdate.pro3
-rw-r--r--tests/benchmarks/corelib/time/qdatetime/qdatetime.pro3
-rw-r--r--tests/benchmarks/corelib/time/qtimezone/main.cpp122
-rw-r--r--tests/benchmarks/corelib/time/qtimezone/qtimezone.pro3
-rw-r--r--tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro4
-rw-r--r--tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro4
-rw-r--r--tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro4
-rw-r--r--tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro9
-rw-r--r--tests/benchmarks/corelib/tools/qcryptographichash/qcryptographichash.pro7
-rw-r--r--tests/benchmarks/corelib/tools/qhash/qhash.pro5
-rw-r--r--tests/benchmarks/corelib/tools/qlist/qlist.pro3
-rw-r--r--tests/benchmarks/corelib/tools/qmap/qmap.pro5
-rw-r--r--tests/benchmarks/corelib/tools/qrect/qrect.pro5
-rw-r--r--tests/benchmarks/corelib/tools/qringbuffer/qringbuffer.pro5
-rw-r--r--tests/benchmarks/corelib/tools/qset/qset.pro5
-rw-r--r--tests/benchmarks/corelib/tools/qstack/qstack.pro5
-rw-r--r--tests/benchmarks/corelib/tools/qvector/qvector.pro7
65 files changed, 994 insertions, 342 deletions
diff --git a/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp b/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
index 06e9fe7a66..d6607dc813 100644
--- a/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
+++ b/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
@@ -1295,10 +1295,9 @@ void tst_QSequentialAnimationGroup::startGroupWithRunningChild()
QCOMPARE(anim1->state(), QAnimationGroup::Running);
QCOMPARE(anim2->state(), QAnimationGroup::Paused);
- QTest::qWait(300);
-
+ // Wait until anim1 finishes (anim2 should be still running)
+ QTRY_COMPARE(anim1->state(), QAnimationGroup::Stopped);
QCOMPARE(group.state(), QAnimationGroup::Running);
- QCOMPARE(anim1->state(), QAnimationGroup::Stopped);
QCOMPARE(anim2->state(), QAnimationGroup::Running);
QCOMPARE(stateChangedSpy2.count(), 4);
@@ -1615,7 +1614,7 @@ void tst_QSequentialAnimationGroup::clear()
group.start();
QTest::qWait(anim1->duration() + 100);
QTRY_COMPARE(group.state(), QAbstractAnimation::Running);
- QVERIFY(anim1 == 0); //anim1 should have been deleted
+ QTRY_COMPARE(anim1, nullptr); // anim1 should have been deleted
}
void tst_QSequentialAnimationGroup::pauseResume()
diff --git a/tests/auto/corelib/serialization/cborlargedatavalidation.cpp b/tests/auto/corelib/serialization/cborlargedatavalidation.cpp
new file mode 100644
index 0000000000..9abfe0f575
--- /dev/null
+++ b/tests/auto/corelib/serialization/cborlargedatavalidation.cpp
@@ -0,0 +1,134 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 Intel Corporation.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtTest/QtTest>
+#include <cbor.h>
+
+namespace {
+// A QIODevice that supplies a fixed header followed by a large sequence of
+// null bytes up until a pre-determined size.
+class LargeIODevice final : public QIODevice
+{
+public:
+ qint64 realSize;
+ QByteArray start;
+
+ LargeIODevice(const QByteArray &start, qint64 size, QObject *parent = nullptr)
+ : QIODevice(parent), realSize(size), start(start)
+ {}
+
+ qint64 size() const override { return realSize; }
+ bool isSequential() const override { return false; }
+
+protected:
+ qint64 readData(char *data, qint64 maxlen) override;
+ qint64 writeData(const char *, qint64) override { return -1; }
+};
+};
+
+qint64 LargeIODevice::readData(char *data, qint64 maxlen)
+{
+ qint64 p = pos();
+ if (maxlen > realSize - p)
+ maxlen = realSize - p;
+ memset(data, '\0', maxlen);
+
+ qint64 fromstart = start.size() - p;
+ if (fromstart > maxlen)
+ fromstart = maxlen;
+ else if (fromstart < 0)
+ fromstart = 0;
+ if (fromstart)
+ memcpy(data, start.constData() + p, fromstart);
+ return maxlen;
+}
+
+void addValidationLargeData(qsizetype minInvalid, qsizetype maxInvalid)
+{
+ char toolong[2 + sizeof(qsizetype)] = { char(0x81) };
+ for (qsizetype v = maxInvalid; v >= minInvalid; --v) {
+ // 0x5a for 32-bit, 0x5b for 64-bit
+ toolong[1] = sizeof(v) > 4 ? 0x5b : 0x5a;
+ qToBigEndian(v, toolong + 2);
+
+ QTest::addRow("bytearray-too-big-for-qbytearray-%llx", v)
+ << QByteArray(toolong, sizeof(toolong)) << 0 << CborErrorDataTooLarge;
+ toolong[1] |= 0x20;
+
+ // QCborStreamReader::readString copies to a QByteArray first
+ QTest::addRow("string-too-big-for-qbytearray-%llx", v)
+ << QByteArray(toolong, sizeof(toolong)) << 0 << CborErrorDataTooLarge;
+ }
+}
+
+void addValidationHugeDevice(qsizetype byteArrayInvalid, qsizetype stringInvalid)
+{
+ qRegisterMetaType<QSharedPointer<QIODevice>>();
+ QTest::addColumn<QSharedPointer<QIODevice>>("device");
+ QTest::addColumn<CborError>("expectedError");
+
+ char buf[1 + sizeof(quint64)];
+ auto device = [&buf](QCborStreamReader::Type t, quint64 size) {
+ buf[0] = quint8(t) | 0x1b;
+ qToBigEndian(size, buf + 1);
+ size += sizeof(buf);
+ QSharedPointer<QIODevice> p =
+ QSharedPointer<LargeIODevice>::create(QByteArray(buf, sizeof(buf)), size);
+ return p;
+ };
+
+ // do the exact limits
+ QTest::newRow("bytearray-just-too-big")
+ << device(QCborStreamReader::ByteArray, byteArrayInvalid) << CborErrorDataTooLarge;
+ QTest::newRow("string-just-too-big")
+ << device(QCborStreamReader::String, stringInvalid) << CborErrorDataTooLarge;
+
+ auto addSize = [=](const char *sizename, qint64 size) {
+ if (byteArrayInvalid < size)
+ QTest::addRow("bytearray-%s", sizename)
+ << device(QCborStreamReader::ByteArray, size) << CborErrorDataTooLarge;
+ if (stringInvalid < size)
+ QTest::addRow("string-%s", sizename)
+ << device(QCborStreamReader::String, size) << CborErrorDataTooLarge;
+ };
+ addSize("1GB", quint64(1) << 30);
+ addSize("2GB", quint64(1) << 31);
+ addSize("4GB", quint64(1) << 32);
+ addSize("max", std::numeric_limits<qint64>::max() - sizeof(buf));
+}
diff --git a/tests/auto/corelib/serialization/qcborstreamreader/qcborstreamreader.pro b/tests/auto/corelib/serialization/qcborstreamreader/qcborstreamreader.pro
index 5df331314a..b758de1a9e 100644
--- a/tests/auto/corelib/serialization/qcborstreamreader/qcborstreamreader.pro
+++ b/tests/auto/corelib/serialization/qcborstreamreader/qcborstreamreader.pro
@@ -1,4 +1,4 @@
-QT = core testlib
+QT = core-private testlib
TARGET = tst_qcborstreamreader
CONFIG += testcase
SOURCES += \
diff --git a/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp b/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp
index 28d29168fb..f969bb9074 100644
--- a/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp
+++ b/tests/auto/corelib/serialization/qcborstreamreader/tst_qcborstreamreader.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2020 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -40,6 +40,8 @@
#include <QtCore/qcborstream.h>
#include <QtTest>
+#include <QtCore/private/qbytearray_p.h>
+
class tst_QCborStreamReader : public QObject
{
Q_OBJECT
@@ -73,6 +75,8 @@ private Q_SLOTS:
void next();
void validation_data();
void validation();
+ void hugeDeviceValidation_data();
+ void hugeDeviceValidation();
void recursionLimit_data();
void recursionLimit();
@@ -902,16 +906,26 @@ void tst_QCborStreamReader::next()
QVERIFY(doit("\xbf\x9f\1\xff\x9f" + data + "\xff\xff"));
}
+#include "../cborlargedatavalidation.cpp"
+
void tst_QCborStreamReader::validation_data()
{
+ // Add QCborStreamReader-specific limitations due to use of QByteArray and
+ // QString, which are allocated by QArrayData::allocate().
+ const qsizetype MaxInvalid = std::numeric_limits<QByteArray::size_type>::max();
+ const qsizetype MinInvalid = MaxByteArraySize + 1;
+
addValidationColumns();
- addValidationData();
+ addValidationData(MinInvalid);
+ addValidationLargeData(MinInvalid, MaxInvalid);
}
void tst_QCborStreamReader::validation()
{
QFETCH_GLOBAL(bool, useDevice);
QFETCH(QByteArray, data);
+ QFETCH(CborError, expectedError);
+ QCborError error = { QCborError::Code(expectedError) };
QBuffer buffer(&data);
QCborStreamReader reader(data);
@@ -920,12 +934,39 @@ void tst_QCborStreamReader::validation()
reader.setDevice(&buffer);
}
parse(reader, data);
- QVERIFY(reader.lastError() != QCborError::NoError);
+ QCOMPARE(reader.lastError(), error);
+
+ // next() should fail
+ reader.reset();
+ QVERIFY(!reader.next());
+ QCOMPARE(reader.lastError(), error);
+}
+
+void tst_QCborStreamReader::hugeDeviceValidation_data()
+{
+ addValidationHugeDevice(MaxByteArraySize + 1, MaxStringSize + 1);
+}
+
+void tst_QCborStreamReader::hugeDeviceValidation()
+{
+ QFETCH_GLOBAL(bool, useDevice);
+ if (!useDevice)
+ return;
+
+ QFETCH(QSharedPointer<QIODevice>, device);
+ QFETCH(CborError, expectedError);
+ QCborError error = { QCborError::Code(expectedError) };
+
+ device->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
+ QCborStreamReader reader(device.data());
+
+ QVERIFY(parseOne(reader).isEmpty());
+ QCOMPARE(reader.lastError(), error);
// next() should fail
reader.reset();
QVERIFY(!reader.next());
- QVERIFY(reader.lastError() != QCborError::NoError);
+ QCOMPARE(reader.lastError(), error);
}
static const int Recursions = 3;
diff --git a/tests/auto/corelib/serialization/qcborvalue/qcborvalue.pro b/tests/auto/corelib/serialization/qcborvalue/qcborvalue.pro
index 9dd67da1f0..4d01b290f5 100644
--- a/tests/auto/corelib/serialization/qcborvalue/qcborvalue.pro
+++ b/tests/auto/corelib/serialization/qcborvalue/qcborvalue.pro
@@ -1,4 +1,4 @@
-QT = core testlib
+QT = core-private testlib
TARGET = tst_qcborvalue
CONFIG += testcase
SOURCES += \
diff --git a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
index d5a9012f9f..6d8161c1f9 100644
--- a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
+++ b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2020 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtCore module of the Qt Toolkit.
@@ -40,6 +40,8 @@
#include <QtCore/qcborvalue.h>
#include <QtTest>
+#include <QtCore/private/qbytearray_p.h>
+
Q_DECLARE_METATYPE(QCborKnownTags)
Q_DECLARE_METATYPE(QCborValue)
Q_DECLARE_METATYPE(QCborValue::EncodingOptions)
@@ -102,6 +104,10 @@ private slots:
void fromCborStreamReaderIODevice();
void validation_data();
void validation();
+ void hugeDeviceValidation_data();
+ void hugeDeviceValidation();
+ void recursionLimit_data();
+ void recursionLimit();
void toDiagnosticNotation_data();
void toDiagnosticNotation();
@@ -1687,39 +1693,127 @@ void tst_QCborValue::fromCborStreamReaderIODevice()
fromCbor_common(doCheck);
}
+#include "../cborlargedatavalidation.cpp"
+
void tst_QCborValue::validation_data()
{
+ // Add QCborStreamReader-specific limitations due to use of QByteArray and
+ // QString, which are allocated by QArrayData::allocate().
+ const qsizetype MaxInvalid = std::numeric_limits<QByteArray::size_type>::max();
+ const qsizetype MinInvalid = MaxByteArraySize + 1;
addValidationColumns();
- addValidationData();
+ addValidationData(MinInvalid);
+ addValidationLargeData(MinInvalid, MaxInvalid);
// These tests say we have arrays and maps with very large item counts.
// They are meant to ensure we don't pre-allocate a lot of memory
// unnecessarily and possibly crash the application. The actual number of
// elements in the stream is only 2, so we should get an unexpected EOF
- // error. QCborValue internally uses 16 bytes per element, so we get to
- // 2 GB at 2^27 elements.
- QTest::addRow("very-large-array-no-overflow") << raw("\x9a\x07\xff\xff\xff" "\0\0");
- QTest::addRow("very-large-array-overflow1") << raw("\x9a\x40\0\0\0" "\0\0");
-
- // this makes sure we don't accidentally clip to 32-bit: sending 2^32+2 elements
- QTest::addRow("very-large-array-overflow2") << raw("\x9b\0\0\0\1""\0\0\0\2" "\0\0");
+ // error. QCborValue internally uses 16 bytes per element, so we get to 2
+ // GB at 2^27 elements (32-bit) or, theoretically, 2^63 bytes at 2^59
+ // elements (64-bit).
+ if (sizeof(QVector<int>::size_type) == sizeof(int)) {
+ // 32-bit sizes (Qt 5 and 32-bit platforms)
+ QTest::addRow("very-large-array-no-overflow") << raw("\x9a\x07\xff\xff\xff" "\0\0") << 0 << CborErrorUnexpectedEOF;
+ QTest::addRow("very-large-array-overflow1") << raw("\x9a\x40\0\0\0" "\0\0") << 0 << CborErrorUnexpectedEOF;
+
+ // this makes sure we don't accidentally clip to 32-bit: sending 2^32+2 elements
+ QTest::addRow("very-large-array-overflow2") << raw("\x9b\0\0\0\1""\0\0\0\2" "\0\0") << 0 << CborErrorDataTooLarge;
+ } else {
+ // 64-bit Qt 6
+ QTest::addRow("very-large-array-no-overflow") << raw("\x9b\x07\xff\xff\xff" "\xff\xff\xff\xff" "\0\0");
+ QTest::addRow("very-large-array-overflow") << raw("\x9b\x40\0\0\0" "\0\0\0\0" "\0\0");
+ }
}
void tst_QCborValue::validation()
{
QFETCH(QByteArray, data);
+ QFETCH(CborError, expectedError);
+ QCborError error = { QCborError::Code(expectedError) };
- QCborParserError error;
- QCborValue decoded = QCborValue::fromCbor(data, &error);
- QVERIFY(error.error != QCborError{});
+ QCborParserError parserError;
+ QCborValue decoded = QCborValue::fromCbor(data, &parserError);
+ QCOMPARE(parserError.error, error);
if (data.startsWith('\x81')) {
// decode without the array prefix
- decoded = QCborValue::fromCbor(data.mid(1), &error);
- QVERIFY(error.error != QCborError{});
+ char *ptr = const_cast<char *>(data.constData());
+ QByteArray mid = QByteArray::fromRawData(ptr + 1, data.size() - 1);
+ decoded = QCborValue::fromCbor(mid, &parserError);
+ QCOMPARE(parserError.error, error);
}
}
+void tst_QCborValue::hugeDeviceValidation_data()
+{
+ addValidationHugeDevice(MaxByteArraySize + 1, MaxStringSize + 1);
+}
+
+void tst_QCborValue::hugeDeviceValidation()
+{
+ QFETCH(QSharedPointer<QIODevice>, device);
+ QFETCH(CborError, expectedError);
+ QCborError error = { QCborError::Code(expectedError) };
+
+ device->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
+ QCborStreamReader reader(device.data());
+ QCborValue decoded = QCborValue::fromCbor(reader);
+ QCOMPARE(reader.lastError(), error);
+}
+
+void tst_QCborValue::recursionLimit_data()
+{
+ constexpr int RecursionAttempts = 4096;
+ QTest::addColumn<QByteArray>("data");
+ QByteArray arrays(RecursionAttempts, char(0x81));
+ QByteArray _arrays(RecursionAttempts, char(0x9f));
+ QByteArray maps(RecursionAttempts, char(0xa1));
+ QByteArray _maps(RecursionAttempts, char(0xbf));
+ QByteArray tags(RecursionAttempts, char(0xc0));
+
+ QTest::newRow("array-nesting-too-deep") << arrays;
+ QTest::newRow("_array-nesting-too-deep") << _arrays;
+ QTest::newRow("map-nesting-too-deep") << maps;
+ QTest::newRow("_map-nesting-too-deep") << _maps;
+ QTest::newRow("tag-nesting-too-deep") << tags;
+
+ QByteArray mixed(5 * RecursionAttempts, Qt::Uninitialized);
+ char *ptr = mixed.data();
+ for (int i = 0; i < RecursionAttempts; ++i) {
+ quint8 type = qBound(quint8(QCborStreamReader::Array), quint8(i & 0x80), quint8(QCborStreamReader::Tag));
+ quint8 additional_info = i & 0x1f;
+ if (additional_info == 0x1f)
+ (void)additional_info; // leave it
+ else if (additional_info > 0x1a)
+ additional_info = 0x1a;
+ else if (additional_info < 1)
+ additional_info = 1;
+
+ *ptr++ = type | additional_info;
+ if (additional_info == 0x18) {
+ *ptr++ = uchar(i);
+ } else if (additional_info == 0x19) {
+ qToBigEndian(ushort(i), ptr);
+ ptr += 2;
+ } else if (additional_info == 0x1a) {
+ qToBigEndian(uint(i), ptr);
+ ptr += 4;
+ }
+ }
+
+ QTest::newRow("mixed-nesting-too-deep") << mixed;
+}
+
+void tst_QCborValue::recursionLimit()
+{
+ QFETCH(QByteArray, data);
+
+ QCborParserError error;
+ QCborValue decoded = QCborValue::fromCbor(data, &error);
+ QCOMPARE(error.error, QCborError::NestingTooDeep);
+}
+
void tst_QCborValue::toDiagnosticNotation_data()
{
QTest::addColumn<QCborValue>("v");
diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
index 2dcca0209e..8466305832 100644
--- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
+++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
@@ -62,6 +62,7 @@ private slots:
void lineBreaking();
#ifdef QT_BUILD_INTERNAL
void simpleBoundingRect();
+ void threeLineBoundingRect_data();
void threeLineBoundingRect();
void boundingRectWithLongLineAndNoWrap();
void forcedBreaks();
@@ -140,6 +141,7 @@ private slots:
void showLineAndParagraphSeparatorsCrash();
void koreanWordWrap();
void tooManyDirectionalCharctersCrash_qtbug77819();
+ void softHyphens();
private:
QFont testFont;
@@ -315,18 +317,49 @@ void tst_QTextLayout::simpleBoundingRect()
QCOMPARE(layout.boundingRect(), QRectF(0, 0, width, QFontMetrics(testFont).height()));
}
+void tst_QTextLayout::threeLineBoundingRect_data()
+{
+ QTest::addColumn<QChar>("wordBoundary1");
+ QTest::addColumn<QChar>("wordBoundary2");
+ QTest::newRow("2x' '") << QChar(' ') << QChar(' ');
+ QTest::newRow("2x'\\n'") << QChar('\n') << QChar('\n');
+ QTest::newRow("' ' + '\\n'") << QChar(' ') << QChar('\n');
+ QTest::newRow("'\\n' + ' '") << QChar('\n') << QChar(' ');
+ QTest::newRow("2x'\\t'") << QChar('\t') << QChar('\t');
+ QTest::newRow("2xsoft hyphen") << QChar(0xad) << QChar(0xad);
+ QTest::newRow("2x'-'") << QChar('-') << QChar('-');
+ QTest::newRow("2x'/'") << QChar('/') << QChar('/');
+ QTest::newRow("soft hyphen + ' '") << QChar(0xad) << QChar(' ');
+ QTest::newRow("soft hyphen + '\\n'") << QChar(0xad) << QChar('\n');
+ QTest::newRow("soft hyphen + '-'") << QChar(0xad) << QChar('-');
+ QTest::newRow("' ' + soft hyphen") << QChar(' ') << QChar(0xad);
+ QTest::newRow("'\\n' + soft hyphen") << QChar('\n') << QChar(0xad);
+ QTest::newRow("'-' + soft hyphen") << QChar('-') << QChar(0xad);
+}
+
void tst_QTextLayout::threeLineBoundingRect()
{
/* stricter check. break text into three lines */
+ QFETCH(QChar, wordBoundary1);
+ QFETCH(QChar, wordBoundary2);
QString firstWord("hello");
- QString secondWord("world");
- QString thirdWord("test");
- QString text(firstWord + ' ' + secondWord + ' ' + thirdWord);
-
- const int firstLineWidth = firstWord.length() * testFont.pixelSize();
- const int secondLineWidth = secondWord.length() * testFont.pixelSize();
- const int thirdLineWidth = thirdWord.length() * testFont.pixelSize();
+ QString secondWord("test");
+ QString thirdWord("world");
+ QString text(firstWord + wordBoundary1 + secondWord + wordBoundary2 + thirdWord);
+
+ int firstLineWidth = firstWord.length() * testFont.pixelSize();
+ int secondLineWidth = secondWord.length() * testFont.pixelSize();
+ int thirdLineWidth = thirdWord.length() * testFont.pixelSize();
+ // Trailing spaces do not count to line width:
+ if (!wordBoundary1.isSpace())
+ firstLineWidth += testFont.pixelSize();
+ if (!wordBoundary2.isSpace())
+ secondLineWidth += testFont.pixelSize();
+ // But trailing spaces do count to line length:
+ const int firstLineLength = firstWord.length() + 1;
+ const int secondLineLength = secondWord.length() + 1;
+ const int thirdLineLength = thirdWord.length();
const int longestLine = qMax(firstLineWidth, qMax(secondLineWidth, thirdLineWidth));
@@ -339,8 +372,7 @@ void tst_QTextLayout::threeLineBoundingRect()
line.setLineWidth(firstLineWidth);
line.setPosition(QPoint(0, y));
QCOMPARE(line.textStart(), pos);
- // + 1 for trailing space
- QCOMPARE(line.textLength(), firstWord.length() + 1);
+ QCOMPARE(line.textLength(), firstLineLength);
QCOMPARE(qRound(line.naturalTextWidth()), firstLineWidth);
pos += line.textLength();
@@ -349,9 +381,8 @@ void tst_QTextLayout::threeLineBoundingRect()
line = layout.createLine();
line.setLineWidth(secondLineWidth);
line.setPosition(QPoint(0, y));
- // + 1 for trailing space
QCOMPARE(line.textStart(), pos);
- QCOMPARE(line.textLength(), secondWord.length() + 1);
+ QCOMPARE(line.textLength(), secondLineLength);
QCOMPARE(qRound(line.naturalTextWidth()), secondLineWidth);
pos += line.textLength();
@@ -360,9 +391,8 @@ void tst_QTextLayout::threeLineBoundingRect()
line = layout.createLine();
line.setLineWidth(secondLineWidth);
line.setPosition(QPoint(0, y));
- // no trailing space here!
QCOMPARE(line.textStart(), pos);
- QCOMPARE(line.textLength(), thirdWord.length());
+ QCOMPARE(line.textLength(), thirdLineLength);
QCOMPARE(qRound(line.naturalTextWidth()), thirdLineWidth);
y += qRound(line.ascent() + line.descent());
@@ -2352,5 +2382,111 @@ void tst_QTextLayout::tooManyDirectionalCharctersCrash_qtbug77819()
tl.endLayout();
}
+void tst_QTextLayout::softHyphens()
+{
+ QString text = QStringLiteral("xxxx\u00ad") + QStringLiteral("xxxx\u00ad");
+
+ QFont font;
+ font.setPixelSize(14);
+ font.setHintingPreference(QFont::PreferNoHinting);
+ const float xAdvance = QFontMetricsF(font).horizontalAdvance(QChar('x'));
+ const float shyAdvance = QFontMetricsF(font).horizontalAdvance(QChar::SoftHyphen);
+ if (xAdvance < (shyAdvance + 1.0f))
+ QSKIP("Default font not suitable for this test.");
+ QTextLayout layout(text, font);
+ QTextOption option;
+ option.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
+ layout.setTextOption(option);
+
+ // Loose fit
+ // xxxx- |
+ // xxxx- |
+ {
+ int pos = 0;
+ int y = 0;
+ layout.beginLayout();
+ QTextLine line = layout.createLine();
+ line.setLineWidth(qCeil(5 * xAdvance) + 1);
+ line.setPosition(QPoint(0, y));
+ QCOMPARE(line.textStart(), pos);
+ QCOMPARE(line.textLength(), 5);
+ QVERIFY(qAbs(line.naturalTextWidth() - (4 * xAdvance + shyAdvance)) <= 1);
+
+ pos += line.textLength();
+ y += qRound(line.ascent() + line.descent());
+
+ line = layout.createLine();
+ line.setLineWidth(qCeil(5 * xAdvance) + 1);
+ line.setPosition(QPoint(0, y));
+ QCOMPARE(line.textStart(), pos);
+ QCOMPARE(line.textLength(), 5);
+ QVERIFY(qAbs(line.naturalTextWidth() - (4 * xAdvance + shyAdvance)) <= 1);
+ layout.endLayout();
+ }
+
+ // Tight fit
+ // xxxx-|
+ // xxxx-|
+ {
+ int pos = 0;
+ int y = 0;
+ layout.beginLayout();
+ QTextLine line = layout.createLine();
+ line.setLineWidth(qCeil(4 * xAdvance + shyAdvance) + 1);
+ line.setPosition(QPoint(0, y));
+ QCOMPARE(line.textStart(), pos);
+ QCOMPARE(line.textLength(), 5);
+ QVERIFY(qAbs(line.naturalTextWidth() - (4 * xAdvance + shyAdvance)) <= 1);
+
+ pos += line.textLength();
+ y += qRound(line.ascent() + line.descent());
+
+ line = layout.createLine();
+ line.setLineWidth(qCeil(4 * xAdvance + shyAdvance) + 1);
+ line.setPosition(QPoint(0, y));
+ QCOMPARE(line.textStart(), pos);
+ QCOMPARE(line.textLength(), 5);
+ QVERIFY(qAbs(line.naturalTextWidth() - (4 * xAdvance + shyAdvance)) <= 1);
+ layout.endLayout();
+ }
+
+ // Very tight fit
+ // xxxx|
+ // xxxx|
+ // - |
+ {
+ int pos = 0;
+ int y = 0;
+ layout.beginLayout();
+ QTextLine line = layout.createLine();
+ line.setLineWidth(qCeil(4 * xAdvance) + 2);
+ line.setPosition(QPoint(0, y));
+ QCOMPARE(line.textStart(), pos);
+ QCOMPARE(line.textLength(), 4);
+ QVERIFY(qAbs(line.naturalTextWidth() - 4 * xAdvance) <= 1);
+
+ pos += line.textLength();
+ y += qRound(line.ascent() + line.descent());
+
+ line = layout.createLine();
+ line.setLineWidth(qCeil(4 * xAdvance) + 2);
+ line.setPosition(QPoint(0, y));
+ QCOMPARE(line.textStart(), pos);
+ QCOMPARE(line.textLength(), 5);
+ QVERIFY(qAbs(line.naturalTextWidth() - 4 * xAdvance) <= 1);
+
+ pos += line.textLength();
+ y += qRound(line.ascent() + line.descent());
+
+ line = layout.createLine();
+ line.setLineWidth(qCeil(4 * xAdvance) + 2);
+ line.setPosition(QPoint(0, y));
+ QCOMPARE(line.textStart(), pos);
+ QCOMPARE(line.textLength(), 1);
+ QVERIFY(qAbs(line.naturalTextWidth() - shyAdvance) <= 1);
+ layout.endLayout();
+ }
+}
+
QTEST_MAIN(tst_QTextLayout)
#include "tst_qtextlayout.moc"
diff --git a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
index 0f419e9de4..bed8a8b129 100644
--- a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
+++ b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
@@ -1090,12 +1090,21 @@ void tst_QUdpSocket::outOfProcessConnectedClientServerTest()
QProcess serverProcess;
serverProcess.start(QLatin1String("clientserver/clientserver server 1 1"),
QIODevice::ReadWrite | QIODevice::Text);
- QVERIFY2(serverProcess.waitForStarted(3000),
- qPrintable("Failed to start subprocess: " + serverProcess.errorString()));
+
+ const auto serverProcessCleaner = qScopeGuard([&serverProcess] {
+ serverProcess.kill();
+ serverProcess.waitForFinished();
+ });
+
+ if (!serverProcess.waitForStarted(3000))
+ QSKIP("Failed to start server as a subprocess");
// Wait until the server has started and reports success.
- while (!serverProcess.canReadLine())
- QVERIFY(serverProcess.waitForReadyRead(3000));
+ while (!serverProcess.canReadLine()) {
+ if (!serverProcess.waitForReadyRead(3000))
+ QSKIP("No output from the server process, bailing out");
+ }
+
QByteArray serverGreeting = serverProcess.readLine();
QVERIFY(serverGreeting != QByteArray("XXX\n"));
int serverPort = serverGreeting.trimmed().toInt();
@@ -1105,12 +1114,21 @@ void tst_QUdpSocket::outOfProcessConnectedClientServerTest()
clientProcess.start(QString::fromLatin1("clientserver/clientserver connectedclient %1 %2")
.arg(QLatin1String("127.0.0.1")).arg(serverPort),
QIODevice::ReadWrite | QIODevice::Text);
- QVERIFY2(clientProcess.waitForStarted(3000),
- qPrintable("Failed to start subprocess: " + clientProcess.errorString()));
- // Wait until the server has started and reports success.
- while (!clientProcess.canReadLine())
- QVERIFY(clientProcess.waitForReadyRead(3000));
+ const auto clientProcessCleaner = qScopeGuard([&clientProcess] {
+ clientProcess.kill();
+ clientProcess.waitForFinished();
+ });
+
+ if (!clientProcess.waitForStarted(3000))
+ QSKIP("Client process did not start");
+
+ // Wait until the client has started and reports success.
+ while (!clientProcess.canReadLine()) {
+ if (!clientProcess.waitForReadyRead(3000))
+ QSKIP("No output from the client process, bailing out");
+ }
+
QByteArray clientGreeting = clientProcess.readLine();
QCOMPARE(clientGreeting, QByteArray("ok\n"));
@@ -1135,11 +1153,6 @@ void tst_QUdpSocket::outOfProcessConnectedClientServerTest()
QCOMPARE(serverData.at(i * 3 + 2).trimmed().mid(8).toInt(),
sdata.mid(4).trimmed().toInt() * 2);
}
-
- clientProcess.kill();
- QVERIFY(clientProcess.waitForFinished());
- serverProcess.kill();
- QVERIFY(serverProcess.waitForFinished());
#endif
}
@@ -1151,12 +1164,21 @@ void tst_QUdpSocket::outOfProcessUnconnectedClientServerTest()
QProcess serverProcess;
serverProcess.start(QLatin1String("clientserver/clientserver server 1 1"),
QIODevice::ReadWrite | QIODevice::Text);
- QVERIFY2(serverProcess.waitForStarted(3000),
- qPrintable("Failed to start subprocess: " + serverProcess.errorString()));
+
+ const auto serverProcessCleaner = qScopeGuard([&serverProcess] {
+ serverProcess.kill();
+ serverProcess.waitForFinished();
+ });
+
+ if (!serverProcess.waitForStarted(3000))
+ QSKIP("Failed to start the server subprocess");
// Wait until the server has started and reports success.
- while (!serverProcess.canReadLine())
- QVERIFY(serverProcess.waitForReadyRead(3000));
+ while (!serverProcess.canReadLine()) {
+ if (!serverProcess.waitForReadyRead(3000))
+ QSKIP("No output from the server, probably, it is not running");
+ }
+
QByteArray serverGreeting = serverProcess.readLine();
QVERIFY(serverGreeting != QByteArray("XXX\n"));
int serverPort = serverGreeting.trimmed().toInt();
@@ -1166,12 +1188,21 @@ void tst_QUdpSocket::outOfProcessUnconnectedClientServerTest()
clientProcess.start(QString::fromLatin1("clientserver/clientserver unconnectedclient %1 %2")
.arg(QLatin1String("127.0.0.1")).arg(serverPort),
QIODevice::ReadWrite | QIODevice::Text);
- QVERIFY2(clientProcess.waitForStarted(3000),
- qPrintable("Failed to start subprocess: " + clientProcess.errorString()));
- // Wait until the server has started and reports success.
- while (!clientProcess.canReadLine())
- QVERIFY(clientProcess.waitForReadyRead(3000));
+ const auto clientProcessCleaner = qScopeGuard([&clientProcess] {
+ clientProcess.kill();
+ clientProcess.waitForFinished();
+ });
+
+ if (!clientProcess.waitForStarted(3000))
+ QSKIP("Failed to start the client's subprocess");
+
+ // Wait until the client has started and reports success.
+ while (!clientProcess.canReadLine()) {
+ if (!clientProcess.waitForReadyRead(3000))
+ QSKIP("The client subprocess produced not output, exiting.");
+ }
+
QByteArray clientGreeting = clientProcess.readLine();
QCOMPARE(clientGreeting, QByteArray("ok\n"));
@@ -1197,11 +1228,6 @@ void tst_QUdpSocket::outOfProcessUnconnectedClientServerTest()
QCOMPARE(serverData.at(i * 3 + 2).trimmed().mid(8).toInt(),
sdata.mid(4).trimmed().toInt() * 2);
}
-
- clientProcess.kill();
- QVERIFY(clientProcess.waitForFinished());
- serverProcess.kill();
- QVERIFY(serverProcess.waitForFinished());
#endif
}
diff --git a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
index 76314564f1..543128915e 100644
--- a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
+++ b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
@@ -51,7 +51,7 @@ private slots:
void about();
void detailsText();
void detailsButtonText();
- void expandDetails_QTBUG_32473();
+ void expandDetailsWithoutMoving();
#ifndef Q_OS_MAC
void shortcut();
@@ -499,7 +499,7 @@ void tst_QMessageBox::detailsButtonText()
}
}
-void tst_QMessageBox::expandDetails_QTBUG_32473()
+void tst_QMessageBox::expandDetailsWithoutMoving() // QTBUG-32473
{
tst_ResizingMessageBox box;
box.setDetailedText("bla");
@@ -516,18 +516,14 @@ void tst_QMessageBox::expandDetails_QTBUG_32473()
auto moreButton = *it;
QVERIFY(QTest::qWaitForWindowExposed(&box));
+ QTRY_VERIFY2(!box.geometry().topLeft().isNull(), "window manager is expected to decorate and position the dialog");
QRect geom = box.geometry();
box.resized = false;
+ // now click the "more" button, and verify that the dialog resizes but does not move
moreButton->click();
QTRY_VERIFY(box.resized);
- // After we receive the expose event for a second widget, it's likely
- // that the window manager is also done manipulating the first QMessageBox.
- QWidget fleece;
- fleece.show();
- QVERIFY(QTest::qWaitForWindowExposed(&fleece));
- if (geom.topLeft() == box.geometry().topLeft())
- QTest::qWait(500);
- QCOMPARE(geom.topLeft(), box.geometry().topLeft());
+ QVERIFY(box.geometry().height() > geom.height());
+ QCOMPARE(box.geometry().topLeft(), geom.topLeft());
}
void tst_QMessageBox::incorrectDefaultButton()
diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
index bcfc477733..5828b099d6 100644
--- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
+++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
@@ -151,6 +151,7 @@ private slots:
void currentFollowsIndexWidget();
void checkFocusAfterActivationChanges_data();
void checkFocusAfterActivationChanges();
+ void dragSelectAfterNewPress();
};
class MyAbstractItemDelegate : public QAbstractItemDelegate
@@ -2514,5 +2515,62 @@ void tst_QAbstractItemView::checkFocusAfterActivationChanges()
QVERIFY(view->hasFocus());
}
+void tst_QAbstractItemView::dragSelectAfterNewPress()
+{
+ QStandardItemModel model;
+ for (int i = 0; i < 10; ++i) {
+ QStandardItem *item = new QStandardItem(QString::number(i));
+ model.setItem(i, 0, item);
+ }
+
+ QListView view;
+ view.setFixedSize(160, 650); // Minimum width for windows with frame on Windows 8
+ view.setSelectionMode(QListView::ExtendedSelection);
+ view.setModel(&model);
+ centerOnScreen(&view);
+ moveCursorAway(&view);
+ view.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&view));
+
+ QModelIndex index0 = model.index(0, 0);
+ QModelIndex index2 = model.index(2, 0);
+
+ view.setCurrentIndex(index0);
+ QCOMPARE(view.currentIndex(), index0);
+
+ // Select item 0 using a single click
+ QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier,
+ view.visualRect(index0).center());
+ QCOMPARE(view.currentIndex(), index0);
+
+ // Press to select item 2
+ QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::ShiftModifier,
+ view.visualRect(index2).center());
+ QCOMPARE(view.currentIndex(), index2);
+
+ // Verify that the selection worked OK
+ QModelIndexList selected = view.selectionModel()->selectedIndexes();
+ QCOMPARE(selected.count(), 3);
+ for (int i = 0; i < 2; ++i)
+ QVERIFY(selected.contains(model.index(i, 0)));
+
+ QModelIndex index5 = model.index(5, 0);
+ const QPoint releasePos = view.visualRect(index5).center();
+ // The mouse move event has to be created manually because the QTest framework does not
+ // contain a function for mouse moves with buttons pressed
+ QMouseEvent moveEvent2(QEvent::MouseMove, releasePos, Qt::NoButton, Qt::LeftButton,
+ Qt::ShiftModifier);
+ const bool moveEventReceived = qApp->notify(view.viewport(), &moveEvent2);
+ QVERIFY(moveEventReceived);
+ QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::ShiftModifier, releasePos);
+ QCOMPARE(view.currentIndex(), index5);
+
+ // Verify that the selection worked OK
+ selected = view.selectionModel()->selectedIndexes();
+ QCOMPARE(selected.count(), 6);
+ for (int i = 0; i < 5; ++i)
+ QVERIFY(selected.contains(model.index(i, 0)));
+}
+
QTEST_MAIN(tst_QAbstractItemView)
#include "tst_qabstractitemview.moc"
diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
index 0580c466cf..b26516ee6b 100644
--- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
@@ -270,6 +270,12 @@ public:
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
{
+ if (onlyValidCalls) {
+ Q_ASSERT(row >= 0);
+ Q_ASSERT(column >= 0);
+ Q_ASSERT(row < rows);
+ Q_ASSERT(column < cols);
+ }
if (row < 0 || column < 0 || (level(parent) > levels) || column >= cols || row >= rows) {
return QModelIndex();
}
@@ -378,6 +384,7 @@ public:
mutable bool fetched = false;
bool decorationsEnabled = false;
bool statusTipsEnabled = false;
+ bool onlyValidCalls = false;
};
// Testing get/set functions
@@ -2420,6 +2427,7 @@ void tst_QTreeView::hiddenItems()
void tst_QTreeView::spanningItems()
{
QtTestModel model(10, 10);
+ model.onlyValidCalls = true;
QTreeView view;
view.setModel(&model);
view.show();
@@ -2459,6 +2467,8 @@ void tst_QTreeView::spanningItems()
}
}
QCOMPARE(view.sizeHintForColumn(0), w);
+
+ view.repaint(); // to check that this doesn't hit any assert
}
void tst_QTreeView::selectionOrderTest()
diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
index 367a5767c4..28bf851d37 100644
--- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
+++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
@@ -93,7 +93,11 @@ private slots:
void quitOnLastWindowClosed();
void closeAllWindows();
void testDeleteLater();
- void testDeleteLaterProcessEvents();
+ void testDeleteLaterProcessEvents1();
+ void testDeleteLaterProcessEvents2();
+ void testDeleteLaterProcessEvents3();
+ void testDeleteLaterProcessEvents4();
+ void testDeleteLaterProcessEvents5();
#if QT_CONFIG(library)
void libraryPaths();
@@ -1225,6 +1229,11 @@ void DeleteLaterWidget::runTest()
QCoreApplication::processEvents();
+ // At this point, the event queue is empty. As we want a deferred
+ // deletion to occur before the timer event, we should provoke the
+ // event dispatcher for the next spin.
+ QCoreApplication::eventDispatcher()->interrupt();
+
QVERIFY(!stillAlive); // verify at the end to make test terminate
}
@@ -1254,8 +1263,10 @@ void tst_QApplication::testDeleteLater()
QObject *stillAlive = wgt->findChild<QObject*>("deleteLater");
QVERIFY(stillAlive);
+ wgt->show();
QCoreApplication::exec();
+ QVERIFY(wgt->isHidden());
delete wgt;
}
@@ -1333,10 +1344,8 @@ public slots:
}
};
-void tst_QApplication::testDeleteLaterProcessEvents()
+void tst_QApplication::testDeleteLaterProcessEvents1()
{
- int argc = 0;
-
// Calling processEvents() with no event dispatcher does nothing.
QObject *object = new QObject;
QPointer<QObject> p(object);
@@ -1344,75 +1353,85 @@ void tst_QApplication::testDeleteLaterProcessEvents()
QApplication::processEvents();
QVERIFY(p);
delete object;
+}
- {
- QApplication app(argc, nullptr);
- // If you call processEvents() with an event dispatcher present, but
- // outside any event loops, deferred deletes are not processed unless
- // sendPostedEvents(0, DeferredDelete) is called.
- object = new QObject;
- p = object;
- object->deleteLater();
- QCoreApplication::processEvents();
- QVERIFY(p);
- QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
- QVERIFY(!p);
-
- // If you call deleteLater() on an object when there is no parent
- // event loop, and then enter an event loop, the object will get
- // deleted.
- object = new QObject;
- p = object;
- object->deleteLater();
- QEventLoop loop;
- QTimer::singleShot(1000, &loop, &QEventLoop::quit);
- loop.exec();
- QVERIFY(!p);
- }
- {
- // When an object is in an event loop, then calls deleteLater() and enters
- // an event loop recursively, it should not die until the parent event
- // loop continues.
- QApplication app(argc, nullptr);
- QEventLoop loop;
- EventLoopNester *nester = new EventLoopNester;
- p = nester;
- QTimer::singleShot(3000, &loop, &QEventLoop::quit);
- QTimer::singleShot(0, nester, &EventLoopNester::deleteLaterAndEnterLoop);
-
- loop.exec();
- QVERIFY(!p);
- }
-
- {
- // When the event loop that calls deleteLater() is exited
- // immediately, the object should die when returning to the
- // parent event loop
- QApplication app(argc, nullptr);
- QEventLoop loop;
- EventLoopNester *nester = new EventLoopNester;
- p = nester;
- QTimer::singleShot(3000, &loop, &QEventLoop::quit);
- QTimer::singleShot(0, nester, &EventLoopNester::deleteLaterAndExitLoop);
+void tst_QApplication::testDeleteLaterProcessEvents2()
+{
+ int argc = 0;
+ QApplication app(argc, nullptr);
+ // If you call processEvents() with an event dispatcher present, but
+ // outside any event loops, deferred deletes are not processed unless
+ // sendPostedEvents(0, DeferredDelete) is called.
+ auto object = new QObject;
+ QPointer<QObject> p(object);
+ object->deleteLater();
+ QCoreApplication::processEvents();
+ QVERIFY(p);
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
+ QVERIFY(!p);
+
+ // If you call deleteLater() on an object when there is no parent
+ // event loop, and then enter an event loop, the object will get
+ // deleted.
+ QEventLoop loop;
+ object = new QObject;
+ connect(object, &QObject::destroyed, &loop, &QEventLoop::quit);
+ p = object;
+ object->deleteLater();
+ QTimer::singleShot(1000, &loop, &QEventLoop::quit);
+ loop.exec();
+ QVERIFY(!p);
+}
- loop.exec();
- QVERIFY(!p);
- }
+void tst_QApplication::testDeleteLaterProcessEvents3()
+{
+ int argc = 0;
+ // When an object is in an event loop, then calls deleteLater() and enters
+ // an event loop recursively, it should not die until the parent event
+ // loop continues.
+ QApplication app(argc, nullptr);
+ QEventLoop loop;
+ EventLoopNester *nester = new EventLoopNester;
+ QPointer<QObject> p(nester);
+ QTimer::singleShot(3000, &loop, &QEventLoop::quit);
+ QTimer::singleShot(0, nester, &EventLoopNester::deleteLaterAndEnterLoop);
+
+ loop.exec();
+ QVERIFY(!p);
+}
- {
- // when the event loop that calls deleteLater() also calls
- // processEvents() immediately afterwards, the object should
- // not die until the parent loop continues
- QApplication app(argc, nullptr);
- QEventLoop loop;
- EventLoopNester *nester = new EventLoopNester();
- p = nester;
- QTimer::singleShot(3000, &loop, &QEventLoop::quit);
- QTimer::singleShot(0, nester, &EventLoopNester::deleteLaterAndProcessEvents);
+void tst_QApplication::testDeleteLaterProcessEvents4()
+{
+ int argc = 0;
+ // When the event loop that calls deleteLater() is exited
+ // immediately, the object should die when returning to the
+ // parent event loop
+ QApplication app(argc, nullptr);
+ QEventLoop loop;
+ EventLoopNester *nester = new EventLoopNester;
+ QPointer<QObject> p(nester);
+ QTimer::singleShot(3000, &loop, &QEventLoop::quit);
+ QTimer::singleShot(0, nester, &EventLoopNester::deleteLaterAndExitLoop);
+
+ loop.exec();
+ QVERIFY(!p);
+}
- loop.exec();
- QVERIFY(!p);
- }
+void tst_QApplication::testDeleteLaterProcessEvents5()
+{
+ // when the event loop that calls deleteLater() also calls
+ // processEvents() immediately afterwards, the object should
+ // not die until the parent loop continues
+ int argc = 0;
+ QApplication app(argc, nullptr);
+ QEventLoop loop;
+ EventLoopNester *nester = new EventLoopNester();
+ QPointer<QObject> p(nester);
+ QTimer::singleShot(3000, &loop, &QEventLoop::quit);
+ QTimer::singleShot(0, nester, &EventLoopNester::deleteLaterAndProcessEvents);
+
+ loop.exec();
+ QVERIFY(!p);
}
/*
diff --git a/tests/auto/widgets/util/qscroller/tst_qscroller.cpp b/tests/auto/widgets/util/qscroller/tst_qscroller.cpp
index 8bdd4b4783..5e71c1888d 100644
--- a/tests/auto/widgets/util/qscroller/tst_qscroller.cpp
+++ b/tests/auto/widgets/util/qscroller/tst_qscroller.cpp
@@ -82,8 +82,8 @@ public:
currentPos = se->contentPos();
overshoot = se->overshootDistance();
- if (!qFuzzyCompare( overshoot.x() + 1.0, 1.0 ) ||
- !qFuzzyCompare( overshoot.y() + 1.0, 1.0 ))
+ if (!qFuzzyCompare(overshoot.x() + 1.0, 1.0) ||
+ !qFuzzyCompare(overshoot.y() + 1.0, 1.0))
receivedOvershoot = true;
return true;
}
@@ -116,8 +116,8 @@ public:
~tst_QScroller() { }
private:
- void kineticScroll( tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd);
- void kineticScrollNoTest( tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd);
+ void kineticScroll(tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd);
+ void kineticScrollNoTest(tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd);
private slots:
void staticScrollers();
@@ -135,13 +135,13 @@ private:
Generates touchBegin, touchUpdate and touchEnd events to trigger scrolling.
Tests some in between states but does not wait until scrolling is finished.
*/
-void tst_QScroller::kineticScroll( tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd)
+void tst_QScroller::kineticScroll(tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd)
{
sw->scrollPosition = from;
sw->currentPos= from;
QScroller *s1 = QScroller::scroller(sw);
- QCOMPARE( s1->state(), QScroller::Inactive );
+ QCOMPARE(s1->state(), QScroller::Inactive);
QScrollerProperties sp1 = QScroller::scroller(sw)->scrollerProperties();
@@ -161,7 +161,7 @@ void tst_QScroller::kineticScroll( tst_QScrollerWidget *sw, QPointF from, QPoint
(QList<QTouchEvent::TouchPoint>() << touchPoint));
QApplication::sendEvent(sw, &touchEvent1);
- QCOMPARE( s1->state(), QScroller::Pressed );
+ QCOMPARE(s1->state(), QScroller::Pressed);
// send the touch update far enough to trigger a scroll
QTest::qWait(200); // we need to wait a little or else the speed would be infinite. now we have around 500 pixel per second.
@@ -175,13 +175,13 @@ void tst_QScroller::kineticScroll( tst_QScrollerWidget *sw, QPointF from, QPoint
(QList<QTouchEvent::TouchPoint>() << touchPoint));
QApplication::sendEvent(sw, &touchEvent2);
- QCOMPARE( s1->state(), QScroller::Dragging );
- QCOMPARE( sw->receivedPrepare, true );
+ QCOMPARE(s1->state(), QScroller::Dragging);
+ QCOMPARE(sw->receivedPrepare, true);
- QTRY_COMPARE( sw->receivedFirst, true );
- QCOMPARE( sw->receivedScroll, true );
- QCOMPARE( sw->receivedOvershoot, false );
+ QTRY_COMPARE(sw->receivedFirst, true);
+ QCOMPARE(sw->receivedScroll, true);
+ QCOMPARE(sw->receivedOvershoot, false);
// note that the scrolling goes in a different direction than the mouse move
QPoint calculatedPos = from.toPoint() - touchUpdate - touchStart;
@@ -204,13 +204,13 @@ void tst_QScroller::kineticScroll( tst_QScrollerWidget *sw, QPointF from, QPoint
Generates touchBegin, touchUpdate and touchEnd events to trigger scrolling.
This function does not have any in between tests, it does not expect the scroller to actually scroll.
*/
-void tst_QScroller::kineticScrollNoTest( tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd)
+void tst_QScroller::kineticScrollNoTest(tst_QScrollerWidget *sw, QPointF from, QPoint touchStart, QPoint touchUpdate, QPoint touchEnd)
{
sw->scrollPosition = from;
sw->currentPos = from;
QScroller *s1 = QScroller::scroller(sw);
- QCOMPARE( s1->state(), QScroller::Inactive );
+ QCOMPARE(s1->state(), QScroller::Inactive);
QScrollerProperties sp1 = s1->scrollerProperties();
int fps = 60;
@@ -348,52 +348,57 @@ void tst_QScroller::scrollerProperties()
void tst_QScroller::scrollTo()
{
- {
- tst_QScrollerWidget *sw = new tst_QScrollerWidget();
- sw->scrollArea = QRectF( 0, 0, 1000, 1000 );
- sw->scrollPosition = QPointF( 500, 500 );
-
- QScroller *s1 = QScroller::scroller(sw);
- QCOMPARE( s1->state(), QScroller::Inactive );
-
- // a normal scroll
- s1->scrollTo(QPointF(100,100), 100);
- QTest::qWait(200);
-
- QCOMPARE( sw->receivedPrepare, true );
- QCOMPARE( sw->receivedScroll, true );
- QCOMPARE( sw->receivedFirst, true );
- QCOMPARE( sw->receivedLast, true );
- QCOMPARE( sw->receivedOvershoot, false );
- QVERIFY(qFuzzyCompare( sw->currentPos.x(), 100 ));
- QVERIFY(qFuzzyCompare( sw->currentPos.y(), 100 ));
-
- delete sw;
- }
+ QScopedPointer<tst_QScrollerWidget> sw(new tst_QScrollerWidget);
+ sw->show();
+ QApplication::setActiveWindow(sw.data());
+ if (!QTest::qWaitForWindowExposed(sw.data()) || !QTest::qWaitForWindowActive(sw.data()))
+ QSKIP("Failed to show and activate window");
+
+ sw->scrollArea = QRectF(0, 0, 1000, 1000);
+ sw->scrollPosition = QPointF(500, 500);
+
+ QScroller *s1 = QScroller::scroller(sw.data());
+ QCOMPARE(s1->state(), QScroller::Inactive);
+
+ // a normal scroll
+ s1->scrollTo(QPointF(100,100), 100);
+ QTest::qWait(200);
+
+ QTRY_COMPARE(sw->receivedPrepare, true);
+ QCOMPARE(sw->receivedScroll, true);
+ QCOMPARE(sw->receivedFirst, true);
+ QCOMPARE(sw->receivedLast, true);
+ QCOMPARE(sw->receivedOvershoot, false);
+ QTRY_VERIFY(qFuzzyCompare(sw->currentPos.x(), 100));
+ QVERIFY(qFuzzyCompare(sw->currentPos.y(), 100));
}
void tst_QScroller::scroll()
{
#if QT_CONFIG(gestures) && QT_CONFIG(scroller)
// -- good case. normal scroll
- tst_QScrollerWidget *sw = new tst_QScrollerWidget();
+ QScopedPointer<tst_QScrollerWidget> sw(new tst_QScrollerWidget());
sw->scrollArea = QRectF(0, 0, 1000, 1000);
- QScroller::grabGesture(sw, QScroller::TouchGesture);
+ QScroller::grabGesture(sw.data(), QScroller::TouchGesture);
sw->setGeometry(100, 100, 400, 300);
+ sw->show();
+ QApplication::setActiveWindow(sw.data());
+ if (!QTest::qWaitForWindowExposed(sw.data()) || !QTest::qWaitForWindowActive(sw.data()))
+ QSKIP("Failed to show and activate window");
- QScroller *s1 = QScroller::scroller(sw);
- kineticScroll(sw, QPointF(500, 500), QPoint(0, 0), QPoint(100, 100), QPoint(200, 200));
+ QScroller *s1 = QScroller::scroller(sw.data());
+ kineticScroll(sw.data(), QPointF(500, 500), QPoint(0, 0), QPoint(100, 100), QPoint(200, 200));
// now we should be scrolling
- QTRY_COMPARE( s1->state(), QScroller::Scrolling );
+ QTRY_COMPARE(s1->state(), QScroller::Scrolling);
// wait until finished, check that no further first scroll is sent
sw->receivedFirst = false;
sw->receivedScroll = false;
QTRY_VERIFY(s1->state() != QScroller::Scrolling);
- QCOMPARE( sw->receivedFirst, false );
- QCOMPARE( sw->receivedScroll, true );
- QCOMPARE( sw->receivedLast, true );
+ QCOMPARE(sw->receivedFirst, false);
+ QCOMPARE(sw->receivedScroll, true);
+ QCOMPARE(sw->receivedLast, true);
QVERIFY(sw->currentPos.x() < 400);
QVERIFY(sw->currentPos.y() < 400);
@@ -401,26 +406,28 @@ void tst_QScroller::scroll()
sw->reset();
sw->scrollArea = QRectF(0, 0, 0, 1000);
- kineticScrollNoTest(sw, QPointF(0, 500), QPoint(0, 0), QPoint(100, 0), QPoint(200, 0));
+ kineticScrollNoTest(sw.data(), QPointF(0, 500), QPoint(0, 0), QPoint(100, 0), QPoint(200, 0));
QTRY_COMPARE(s1->state(), QScroller::Inactive);
QCOMPARE(sw->currentPos.x(), 0.0);
QCOMPARE(sw->currentPos.y(), 500.0);
-
- delete sw;
#endif
}
void tst_QScroller::overshoot()
{
#if QT_CONFIG(gestures) && QT_CONFIG(scroller)
- tst_QScrollerWidget *sw = new tst_QScrollerWidget();
+ QScopedPointer<tst_QScrollerWidget> sw(new tst_QScrollerWidget);
sw->scrollArea = QRectF(0, 0, 1000, 1000);
- QScroller::grabGesture(sw, QScroller::TouchGesture);
+ QScroller::grabGesture(sw.data(), QScroller::TouchGesture);
sw->setGeometry(100, 100, 400, 300);
+ sw->show();
+ QApplication::setActiveWindow(sw.data());
+ if (!QTest::qWaitForWindowExposed(sw.data()) || !QTest::qWaitForWindowActive(sw.data()))
+ QSKIP("Failed to show and activate window");
- QScroller *s1 = QScroller::scroller(sw);
+ QScroller *s1 = QScroller::scroller(sw.data());
QScrollerProperties sp1 = s1->scrollerProperties();
sp1.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, 0.5);
@@ -431,14 +438,14 @@ void tst_QScroller::overshoot()
sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootWhenScrollable));
s1->setScrollerProperties(sp1);
- kineticScrollNoTest(sw, QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+ kineticScrollNoTest(sw.data(), QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
QTRY_COMPARE(s1->state(), QScroller::Inactive);
//qDebug() << "Overshoot fuzzy: "<<sw->currentPos;
- QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
- QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
- QCOMPARE( sw->receivedOvershoot, true );
+ QVERIFY(qFuzzyCompare(sw->currentPos.x(), 0));
+ QVERIFY(qFuzzyCompare(sw->currentPos.y(), 500));
+ QCOMPARE(sw->receivedOvershoot, true);
// -- try to scroll with overshoot (when scrollable bad case)
sw->reset();
@@ -446,14 +453,14 @@ void tst_QScroller::overshoot()
sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootWhenScrollable));
s1->setScrollerProperties(sp1);
- kineticScrollNoTest(sw, QPointF(0, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+ kineticScrollNoTest(sw.data(), QPointF(0, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
QTRY_COMPARE(s1->state(), QScroller::Inactive);
//qDebug() << "Overshoot fuzzy: "<<sw->currentPos;
- QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
- QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
- QCOMPARE( sw->receivedOvershoot, false );
+ QVERIFY(qFuzzyCompare(sw->currentPos.x(), 0));
+ QVERIFY(qFuzzyCompare(sw->currentPos.y(), 500));
+ QCOMPARE(sw->receivedOvershoot, false);
// -- try to scroll with overshoot (always on)
sw->reset();
@@ -461,15 +468,15 @@ void tst_QScroller::overshoot()
sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootAlwaysOn));
s1->setScrollerProperties(sp1);
- kineticScrollNoTest(sw, QPointF(0, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+ kineticScrollNoTest(sw.data(), QPointF(0, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
QTRY_COMPARE(s1->state(), QScroller::Inactive);
//qDebug() << "Overshoot fuzzy: "<<sw->currentPos;
- QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
- QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
- QCOMPARE( sw->receivedOvershoot, true );
+ QVERIFY(qFuzzyCompare(sw->currentPos.x(), 0));
+ QVERIFY(qFuzzyCompare(sw->currentPos.y(), 500));
+ QCOMPARE(sw->receivedOvershoot, true);
// -- try to scroll with overshoot (always off)
sw->reset();
@@ -477,13 +484,13 @@ void tst_QScroller::overshoot()
sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootAlwaysOff));
s1->setScrollerProperties(sp1);
- kineticScrollNoTest(sw, QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+ kineticScrollNoTest(sw.data(), QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
QTRY_COMPARE(s1->state(), QScroller::Inactive);
- QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
- QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
- QCOMPARE( sw->receivedOvershoot, false );
+ QVERIFY(qFuzzyCompare(sw->currentPos.x(), 0));
+ QVERIFY(qFuzzyCompare(sw->currentPos.y(), 500));
+ QCOMPARE(sw->receivedOvershoot, false);
// -- try to scroll with overshoot (always on but max overshoot = 0)
sp1.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, 0.0);
@@ -493,39 +500,39 @@ void tst_QScroller::overshoot()
sp1.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QVariant::fromValue(QScrollerProperties::OvershootAlwaysOn));
s1->setScrollerProperties(sp1);
- kineticScrollNoTest(sw, QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
+ kineticScrollNoTest(sw.data(), QPointF(500, 500), QPoint(0, 0), QPoint(400, 0), QPoint(490, 0));
QTRY_COMPARE(s1->state(), QScroller::Inactive);
- QVERIFY(qFuzzyCompare( sw->currentPos.x(), 0 ));
- QVERIFY(qFuzzyCompare( sw->currentPos.y(), 500 ));
- QCOMPARE( sw->receivedOvershoot, false );
-
- delete sw;
+ QVERIFY(qFuzzyCompare(sw->currentPos.x(), 0));
+ QVERIFY(qFuzzyCompare(sw->currentPos.y(), 500));
+ QCOMPARE(sw->receivedOvershoot, false);
#endif
}
void tst_QScroller::multipleWindows()
{
#if QT_CONFIG(gestures) && QT_CONFIG(scroller)
- QScopedPointer<tst_QScrollerWidget> sw1(new tst_QScrollerWidget());
+ QScopedPointer<tst_QScrollerWidget> sw1(new tst_QScrollerWidget);
sw1->scrollArea = QRectF(0, 0, 1000, 1000);
QScroller::grabGesture(sw1.data(), QScroller::TouchGesture);
sw1->setGeometry(100, 100, 400, 300);
+
QScroller *s1 = QScroller::scroller(sw1.data());
kineticScroll(sw1.data(), QPointF(500, 500), QPoint(0, 0), QPoint(100, 100), QPoint(200, 200));
// now we should be scrolling
- QTRY_COMPARE( s1->state(), QScroller::Scrolling );
+ QTRY_COMPARE(s1->state(), QScroller::Scrolling);
// That was fun! Do it again!
QScopedPointer<tst_QScrollerWidget> sw2(new tst_QScrollerWidget());
sw2->scrollArea = QRectF(0, 0, 1000, 1000);
QScroller::grabGesture(sw2.data(), QScroller::TouchGesture);
sw2->setGeometry(100, 100, 400, 300);
+
QScroller *s2 = QScroller::scroller(sw2.data());
kineticScroll(sw2.data(), QPointF(500, 500), QPoint(0, 0), QPoint(100, 100), QPoint(200, 200));
// now we should be scrolling
- QTRY_COMPARE( s2->state(), QScroller::Scrolling );
+ QTRY_COMPARE(s2->state(), QScroller::Scrolling);
// wait for both to stop
QTRY_VERIFY(s1->state() != QScroller::Scrolling);
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index 727d1c2a16..1fc1c65be0 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -1264,7 +1264,7 @@ void tst_QMenu::QTBUG47515_widgetActionEnterLeave()
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation))
QSKIP("Window activation is not supported");
if (QGuiApplication::platformName() == QLatin1String("cocoa"))
- QSKIP("See QTBUG-63031");
+ QSKIP("This test is meaningless on macOS, for additional info see QTBUG-63031");
const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry();
QRect geometry(QPoint(), availableGeometry.size() / 3);
diff --git a/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
index 5ee577c256..7d29c6bfdd 100644
--- a/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
+++ b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
@@ -1,6 +1,7 @@
-TARGET = tst_bench_qtextcodec
+CONFIG += benchmark
QT = core testlib
+
+TARGET = tst_bench_qtextcodec
SOURCES += main.cpp
TESTDATA = utf-8.txt
-
diff --git a/tests/benchmarks/corelib/io/qdir/10000/10000.pro b/tests/benchmarks/corelib/io/qdir/10000/10000.pro
index 2e83dad071..52325f314f 100644
--- a/tests/benchmarks/corelib/io/qdir/10000/10000.pro
+++ b/tests/benchmarks/corelib/io/qdir/10000/10000.pro
@@ -1,6 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qdir_10000
+CONFIG += benchmark
+QT = core testlib
+TARGET = tst_bench_qdir_10000
SOURCES += bench_qdir_10000.cpp
-
-QT = core testlib
diff --git a/tests/benchmarks/corelib/io/qdir/tree/tree.pro b/tests/benchmarks/corelib/io/qdir/tree/tree.pro
index 2998a13b57..90ddd23345 100644
--- a/tests/benchmarks/corelib/io/qdir/tree/tree.pro
+++ b/tests/benchmarks/corelib/io/qdir/tree/tree.pro
@@ -1,7 +1,7 @@
TEMPLATE = app
-TARGET = bench_qdir_tree
+CONFIG += benchmark
+QT = core testlib
+TARGET = bench_qdir_tree
SOURCES += bench_qdir_tree.cpp
RESOURCES += bench_qdir_tree.qrc
-
-QT = core testlib
diff --git a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
index 061b22a5d1..b332cda84b 100644
--- a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
+++ b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
@@ -1,8 +1,6 @@
-TARGET = tst_bench_qdiriterator
-
+CONFIG += benchmark
QT = core testlib
-CONFIG += release
-
+TARGET = tst_bench_qdiriterator
SOURCES += main.cpp qfilesystemiterator.cpp
HEADERS += qfilesystemiterator.h
diff --git a/tests/benchmarks/corelib/io/qfile/qfile.pro b/tests/benchmarks/corelib/io/qfile/qfile.pro
index 5f7b9af73f..a882c4ea61 100644
--- a/tests/benchmarks/corelib/io/qfile/qfile.pro
+++ b/tests/benchmarks/corelib/io/qfile/qfile.pro
@@ -1,6 +1,7 @@
TEMPLATE = app
-TARGET = tst_bench_qfile
+CONFIG += benchmark
QT = core core-private testlib
win32: DEFINES+= _CRT_SECURE_NO_WARNINGS
+TARGET = tst_bench_qfile
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro b/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
index 42e8708b02..9c97bfc84a 100644
--- a/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
+++ b/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
@@ -1,9 +1,7 @@
TEMPLATE = app
-TARGET = tst_bench_qfileinfo
-
+CONFIG += benchmark
QT -= gui
QT += core-private testlib
-CONFIG += release
-
+TARGET = tst_bench_qfileinfo
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro b/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
index 7937436e13..febe6e87f9 100644
--- a/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
+++ b/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
@@ -1,8 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qiodevice
-
+CONFIG += benchmark
QT = core testlib
-CONFIG += release
-
+TARGET = tst_bench_qiodevice
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/io/qprocess/test/test.pro b/tests/benchmarks/corelib/io/qprocess/test/test.pro
index b665525b17..e7e8e01aef 100644
--- a/tests/benchmarks/corelib/io/qprocess/test/test.pro
+++ b/tests/benchmarks/corelib/io/qprocess/test/test.pro
@@ -1,4 +1,5 @@
+CONFIG += benchmark
+QT = core core-private testlib
+
TARGET = ../tst_bench_qprocess
SOURCES += ../tst_bench_qprocess.cpp
-
-QT = core core-private testlib
diff --git a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
index a0230e1cb8..1f56ad6ee6 100644
--- a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
+++ b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
@@ -1,5 +1,7 @@
-SOURCES = main.cpp
+CONFIG += benchmark
CONFIG -= qt
CONFIG += cmdline
winrt: QMAKE_LFLAGS += /ENTRY:mainCRTStartup
+
+SOURCES = main.cpp
DESTDIR = ./
diff --git a/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro b/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
index 758930c139..b6064e1f91 100644
--- a/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
+++ b/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
@@ -1,8 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qtemporaryfile
-
+CONFIG += benchmark
QT = core testlib
-CONFIG += release
-
+TARGET = tst_bench_qtemporaryfile
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro b/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
index e8170319f2..fb45d05bc9 100644
--- a/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
+++ b/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
@@ -1,8 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qtextstream
-
+CONFIG += benchmark
QT = core testlib
-CONFIG += release
-
+TARGET = tst_bench_qtextstream
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/io/qurl/qurl.pro b/tests/benchmarks/corelib/io/qurl/qurl.pro
index 52f7bdc8b6..0e10e32a22 100644
--- a/tests/benchmarks/corelib/io/qurl/qurl.pro
+++ b/tests/benchmarks/corelib/io/qurl/qurl.pro
@@ -1,6 +1,7 @@
TEMPLATE = app
-TARGET = tst_qurl
+CONFIG += benchmark
QT = core testlib
win32: DEFINES+= _CRT_SECURE_NO_WARNINGS
+TARGET = tst_qurl
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/json/json.pro b/tests/benchmarks/corelib/json/json.pro
index 004f4b123e..8f9e515cb9 100644
--- a/tests/benchmarks/corelib/json/json.pro
+++ b/tests/benchmarks/corelib/json/json.pro
@@ -1,7 +1,8 @@
-TARGET = tst_bench_qtbinaryjson
QT = core testlib
+CONFIG += benchmark
CONFIG -= app_bundle
+TARGET = tst_bench_qtbinaryjson
SOURCES += tst_bench_qtbinaryjson.cpp
TESTDATA = numbers.json test.json
diff --git a/tests/benchmarks/corelib/kernel/events/events.pro b/tests/benchmarks/corelib/kernel/events/events.pro
index 798a880e5b..1381bb001e 100644
--- a/tests/benchmarks/corelib/kernel/events/events.pro
+++ b/tests/benchmarks/corelib/kernel/events/events.pro
@@ -1,6 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_events
-
+CONFIG += benchmark
QT = core testlib
+TARGET = tst_bench_events
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro b/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
index 8bf8487a5f..5572f06924 100644
--- a/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
+++ b/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
@@ -1,6 +1,6 @@
+TEMPLATE = app
+CONFIG += benchmark
QT = core testlib
-TEMPLATE = app
TARGET = tst_bench_qcoreapplication
-
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro b/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
index 47d2acb9b1..0d595ed4da 100644
--- a/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
+++ b/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
@@ -1,5 +1,6 @@
TEMPLATE = app
+CONFIG += benchmark
QT += widgets testlib
-TARGET = tst_bench_qmetaobject
+TARGET = tst_bench_qmetaobject
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro b/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
index 83d0708b60..ffd36ad202 100644
--- a/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
+++ b/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
@@ -1,6 +1,6 @@
-QT = core testlib
TEMPLATE = app
-TARGET = tst_bench_qmetatype
+CONFIG += benchmark
+QT = core testlib
+TARGET = tst_bench_qmetatype
SOURCES += tst_qmetatype.cpp
-
diff --git a/tests/benchmarks/corelib/kernel/qobject/qobject.pro b/tests/benchmarks/corelib/kernel/qobject/qobject.pro
index e611eff0a2..eb1d8a2daa 100644
--- a/tests/benchmarks/corelib/kernel/qobject/qobject.pro
+++ b/tests/benchmarks/corelib/kernel/qobject/qobject.pro
@@ -1,7 +1,7 @@
+TEMPLATE = app
+CONFIG += benchmark
QT += widgets testlib
-TEMPLATE = app
TARGET = tst_bench_qobject
-
HEADERS += object.h
SOURCES += main.cpp object.cpp
diff --git a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
index e127ba1934..3d4e48e76c 100644
--- a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
+++ b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
@@ -1,10 +1,7 @@
TEMPLATE = app
-TARGET = qtimer_vs_qmetaobject
-INCLUDEPATH += .
-
-CONFIG += release
-#CONFIG += debug
-
+CONFIG += benchmark
+QT = core testlib
+INCLUDEPATH += .
+TARGET = qtimer_vs_qmetaobject
SOURCES += tst_qtimer_vs_qmetaobject.cpp
-QT = core testlib
diff --git a/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro b/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
index 8a8e9f25d3..2616ae78ea 100644
--- a/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
+++ b/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
@@ -1,9 +1,6 @@
-TARGET = tst_bench_qvariant
+CONFIG += benchmark
QT += testlib
!qtHaveModule(gui): QT -= gui
-CONFIG += release
-#CONFIG += debug
-
-
+TARGET = tst_bench_qvariant
SOURCES += tst_qvariant.cpp
diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro b/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
index fe55b98e54..3d218554d3 100644
--- a/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
+++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
@@ -1,5 +1,5 @@
+CONFIG += benchmark
QT = core testlib
TARGET = tst_bench_qmimedatabase
SOURCES = main.cpp
-
diff --git a/tests/benchmarks/corelib/plugin/quuid/quuid.pro b/tests/benchmarks/corelib/plugin/quuid/quuid.pro
index 8f88bb85b4..5179c0cc40 100644
--- a/tests/benchmarks/corelib/plugin/quuid/quuid.pro
+++ b/tests/benchmarks/corelib/plugin/quuid/quuid.pro
@@ -1,5 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_quuid
+CONFIG += benchmark
+QT = core testlib
+TARGET = tst_bench_quuid
SOURCES += tst_quuid.cpp
-QT = core testlib
diff --git a/tests/benchmarks/corelib/text/qbytearray/qbytearray.pro b/tests/benchmarks/corelib/text/qbytearray/qbytearray.pro
index cf28b0247f..25af9512d4 100644
--- a/tests/benchmarks/corelib/text/qbytearray/qbytearray.pro
+++ b/tests/benchmarks/corelib/text/qbytearray/qbytearray.pro
@@ -1,7 +1,7 @@
TEMPLATE = app
-TARGET = tst_bench_qbytearray
-
+CONFIG += benchmark
QT = core testlib
-TESTDATA += main.cpp
+TARGET = tst_bench_qbytearray
SOURCES += main.cpp
+TESTDATA += main.cpp
diff --git a/tests/benchmarks/corelib/text/qchar/qchar.pro b/tests/benchmarks/corelib/text/qchar/qchar.pro
index 80a9861f48..902acbb831 100644
--- a/tests/benchmarks/corelib/text/qchar/qchar.pro
+++ b/tests/benchmarks/corelib/text/qchar/qchar.pro
@@ -1,3 +1,5 @@
-TARGET = tst_bench_qchar
+CONFIG += benchmark
QT = core testlib
+
+TARGET = tst_bench_qchar
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/text/qlocale/qlocale.pro b/tests/benchmarks/corelib/text/qlocale/qlocale.pro
index e56bbe0341..a39a20a677 100644
--- a/tests/benchmarks/corelib/text/qlocale/qlocale.pro
+++ b/tests/benchmarks/corelib/text/qlocale/qlocale.pro
@@ -1,4 +1,5 @@
-TARGET = tst_bench_qlocale
+CONFIG += benchmark
QT = core testlib
+TARGET = tst_bench_qlocale
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/text/qregexp/qregexp.pro b/tests/benchmarks/corelib/text/qregexp/qregexp.pro
index f64ae781a2..c04c13060b 100644
--- a/tests/benchmarks/corelib/text/qregexp/qregexp.pro
+++ b/tests/benchmarks/corelib/text/qregexp/qregexp.pro
@@ -1,8 +1,9 @@
TEMPLATE = app
-TARGET = tst_bench_qregexp
+CONFIG += benchmark
+CONFIG += exceptions
QT = core testlib
-CONFIG += release exceptions
+TARGET = tst_bench_qregexp
SOURCES += main.cpp
RESOURCES += qregexp.qrc
@@ -17,4 +18,3 @@ qtHaveModule(script):!pcre {
LIBS += -lboost_regex
}
}
-
diff --git a/tests/benchmarks/corelib/text/qstring/qstring.pro b/tests/benchmarks/corelib/text/qstring/qstring.pro
index 9f5e34b915..e25431b983 100644
--- a/tests/benchmarks/corelib/text/qstring/qstring.pro
+++ b/tests/benchmarks/corelib/text/qstring/qstring.pro
@@ -1,5 +1,6 @@
-TARGET = tst_bench_qstring
+CONFIG += benchmark
QT -= gui
QT += core testlib
-SOURCES += main.cpp
+TARGET = tst_bench_qstring
+SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/text/qstringbuilder/qstringbuilder.pro b/tests/benchmarks/corelib/text/qstringbuilder/qstringbuilder.pro
index fa4cbe3c13..91421b3b2c 100644
--- a/tests/benchmarks/corelib/text/qstringbuilder/qstringbuilder.pro
+++ b/tests/benchmarks/corelib/text/qstringbuilder/qstringbuilder.pro
@@ -1,11 +1,9 @@
TEMPLATE = app
-TARGET = tst_bench_qstringbuilder
+CONFIG += benchmark
+QT = core testlib
QMAKE_CXXFLAGS += -g
QMAKE_CFLAGS += -g
-QT = core testlib
-
-CONFIG += release
-
-SOURCES += main.cpp
+TARGET = tst_bench_qstringbuilder
+SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/text/qstringlist/qstringlist.pro b/tests/benchmarks/corelib/text/qstringlist/qstringlist.pro
index 5803e7da0e..a27bf0a6ab 100644
--- a/tests/benchmarks/corelib/text/qstringlist/qstringlist.pro
+++ b/tests/benchmarks/corelib/text/qstringlist/qstringlist.pro
@@ -1,5 +1,5 @@
-TARGET = tst_bench_qstringlist
-CONFIG -= debug
-CONFIG += release
+CONFIG += benchmark
QT = core testlib
+
+TARGET = tst_bench_qstringlist
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
index ec87f60919..a0b2ddeaa9 100644
--- a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
+++ b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
@@ -1,5 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qmutex
+CONFIG += benchmark
QT = core testlib
-SOURCES += tst_qmutex.cpp
+TARGET = tst_bench_qmutex
+SOURCES += tst_qmutex.cpp
diff --git a/tests/benchmarks/corelib/thread/qreadwritelock/qreadwritelock.pro b/tests/benchmarks/corelib/thread/qreadwritelock/qreadwritelock.pro
index a1827d0276..7c36067cb7 100644
--- a/tests/benchmarks/corelib/thread/qreadwritelock/qreadwritelock.pro
+++ b/tests/benchmarks/corelib/thread/qreadwritelock/qreadwritelock.pro
@@ -1,7 +1,8 @@
TEMPLATE = app
-TARGET = tst_bench_qreadwritelock
-QT = core-private testlib
-SOURCES += tst_qreadwritelock.cpp
+CONFIG += benchmark
CONFIG += c++14 # for std::shared_timed_mutex
CONFIG += c++1z # for std::shared_mutex
+QT = core-private testlib
+TARGET = tst_bench_qreadwritelock
+SOURCES += tst_qreadwritelock.cpp
diff --git a/tests/benchmarks/corelib/thread/qthreadpool/qthreadpool.pro b/tests/benchmarks/corelib/thread/qthreadpool/qthreadpool.pro
index 47e16e8b4d..303b3cef69 100644
--- a/tests/benchmarks/corelib/thread/qthreadpool/qthreadpool.pro
+++ b/tests/benchmarks/corelib/thread/qthreadpool/qthreadpool.pro
@@ -1,5 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qthreadpool
+CONFIG += benchmark
+QT = core testlib
+TARGET = tst_bench_qthreadpool
SOURCES += tst_qthreadpool.cpp
-QT = core testlib
diff --git a/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro b/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
index 95afc951bc..3f62c4eb3c 100644
--- a/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
+++ b/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
@@ -1,5 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qthreadstorage
+CONFIG += benchmark
+QT = core testlib
+TARGET = tst_bench_qthreadstorage
SOURCES += tst_qthreadstorage.cpp
-QT = core testlib
diff --git a/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro b/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
index 43c7921a93..cc801bdc13 100644
--- a/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
+++ b/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
@@ -1,4 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qwaitcondition
+CONFIG += benchmark
QT = core testlib
+
+TARGET = tst_bench_qwaitcondition
SOURCES += tst_qwaitcondition.cpp
diff --git a/tests/benchmarks/corelib/time/qdate/qdate.pro b/tests/benchmarks/corelib/time/qdate/qdate.pro
index a655917135..ecb229dfda 100644
--- a/tests/benchmarks/corelib/time/qdate/qdate.pro
+++ b/tests/benchmarks/corelib/time/qdate/qdate.pro
@@ -1,4 +1,5 @@
-TARGET = tst_bench_qdate
+CONFIG += benchmark
QT = core testlib
+TARGET = tst_bench_qdate
SOURCES += tst_bench_qdate.cpp
diff --git a/tests/benchmarks/corelib/time/qdatetime/qdatetime.pro b/tests/benchmarks/corelib/time/qdatetime/qdatetime.pro
index a85e7346c6..7133834ffc 100644
--- a/tests/benchmarks/corelib/time/qdatetime/qdatetime.pro
+++ b/tests/benchmarks/corelib/time/qdatetime/qdatetime.pro
@@ -1,4 +1,5 @@
-TARGET = tst_bench_qdatetime
+CONFIG += benchmark
QT = core testlib
+TARGET = tst_bench_qdatetime
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/time/qtimezone/main.cpp b/tests/benchmarks/corelib/time/qtimezone/main.cpp
index 65455a7261..133e6451bc 100644
--- a/tests/benchmarks/corelib/time/qtimezone/main.cpp
+++ b/tests/benchmarks/corelib/time/qtimezone/main.cpp
@@ -1,5 +1,6 @@
/****************************************************************************
**
+** Copyright (C) 2019 Crimson AS <info@crimson.no>
** Copyright (C) 2018 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com>
** Contact: https://www.qt.io/licensing/
**
@@ -30,14 +31,57 @@
#include <QTest>
#include <qdebug.h>
+// Enable to test *every* zone, rather than a hand-picked few, in some _data() sets:
+// #define EXHAUSTIVE
+
class tst_QTimeZone : public QObject
{
Q_OBJECT
private Q_SLOTS:
void isTimeZoneIdAvailable();
+ void systemTimeZone();
+ void zoneByName_data();
+ void zoneByName();
+ void transitionList_data();
+ void transitionList();
+ void transitionsForward_data() { transitionList_data(); }
+ void transitionsForward();
+ void transitionsReverse_data() { transitionList_data(); }
+ void transitionsReverse();
};
+static QVector<QByteArray> enoughZones()
+{
+#ifdef EXHAUSTIVE
+ auto available = QTimeZone::availableTimeZoneIds();
+ QVector<QByteArray> result;
+ result.reserve(available.size() + 1);
+ for (conat auto &name : available)
+ result << name;
+#else
+ QVector<QByteArray> result{
+ QByteArray("UTC"),
+ // Those named overtly in tst_QDateTime:
+ QByteArray("Europe/Oslo"),
+ QByteArray("America/Vancouver"),
+ QByteArray("Europe/Berlin"),
+ QByteArray("America/Sao_Paulo"),
+ QByteArray("Pacific/Auckland"),
+ QByteArray("Australia/Eucla"),
+ QByteArray("Asia/Kathmandu"),
+ QByteArray("Pacific/Kiritimati"),
+ QByteArray("Pacific/Apia"),
+ QByteArray("UTC+12:00"),
+ QByteArray("Australia/Sydney"),
+ QByteArray("Asia/Singapore"),
+ QByteArray("Australia/Brisbane")
+ };
+#endif
+ result << QByteArray("Vulcan/ShiKahr"); // invalid: also worth testing
+ return result;
+}
+
void tst_QTimeZone::isTimeZoneIdAvailable()
{
const QList<QByteArray> available = QTimeZone::availableTimeZoneIds();
@@ -47,6 +91,84 @@ void tst_QTimeZone::isTimeZoneIdAvailable()
}
}
+void tst_QTimeZone::systemTimeZone()
+{
+ QBENCHMARK {
+ QTimeZone::systemTimeZone();
+ }
+}
+
+void tst_QTimeZone::zoneByName_data()
+{
+ QTest::addColumn<QByteArray>("name");
+
+ const auto names = enoughZones();
+ for (const auto &name : names)
+ QTest::newRow(name.constData()) << name;
+}
+
+void tst_QTimeZone::zoneByName()
+{
+ QFETCH(QByteArray, name);
+ QTimeZone zone;
+ QBENCHMARK {
+ zone = QTimeZone(name);
+ }
+ Q_UNUSED(zone);
+}
+
+void tst_QTimeZone::transitionList_data()
+{
+ QTest::addColumn<QByteArray>("name");
+ QTest::newRow("system") << QByteArray(); // Handled specially in the test.
+
+ const auto names = enoughZones();
+ for (const auto &name : names) {
+ QTimeZone zone(name);
+ if (zone.isValid() && zone.hasTransitions())
+ QTest::newRow(name.constData()) << name;
+ }
+}
+
+void tst_QTimeZone::transitionList()
+{
+ QFETCH(QByteArray, name);
+ const QTimeZone zone = name.isEmpty() ? QTimeZone::systemTimeZone() : QTimeZone(name);
+ const QDateTime early = QDate(1625, 6, 8).startOfDay(Qt::UTC); // Cassini's birth date
+ const QDateTime late // End of 32-bit signed time_t
+ = QDateTime::fromSecsSinceEpoch(std::numeric_limits<qint32>::max(), Qt::UTC);
+ QTimeZone::OffsetDataList seq;
+ QBENCHMARK {
+ seq = zone.transitions(early, late);
+ }
+ Q_UNUSED(seq);
+}
+
+void tst_QTimeZone::transitionsForward()
+{
+ QFETCH(QByteArray, name);
+ const QTimeZone zone = name.isEmpty() ? QTimeZone::systemTimeZone() : QTimeZone(name);
+ const QDateTime early = QDate(1625, 6, 8).startOfDay(Qt::UTC); // Cassini's birth date
+ QBENCHMARK {
+ QTimeZone::OffsetData tran = zone.nextTransition(early);
+ while (tran.atUtc.isValid())
+ tran = zone.nextTransition(tran.atUtc);
+ }
+}
+
+void tst_QTimeZone::transitionsReverse()
+{
+ QFETCH(QByteArray, name);
+ const QTimeZone zone = name.isEmpty() ? QTimeZone::systemTimeZone() : QTimeZone(name);
+ const QDateTime late // End of 32-bit signed time_t
+ = QDateTime::fromSecsSinceEpoch(std::numeric_limits<qint32>::max(), Qt::UTC);
+ QBENCHMARK {
+ QTimeZone::OffsetData tran = zone.previousTransition(late);
+ while (tran.atUtc.isValid())
+ tran = zone.previousTransition(tran.atUtc);
+ }
+}
+
QTEST_MAIN(tst_QTimeZone)
#include "main.moc"
diff --git a/tests/benchmarks/corelib/time/qtimezone/qtimezone.pro b/tests/benchmarks/corelib/time/qtimezone/qtimezone.pro
index d0531b568b..6ebee0faf3 100644
--- a/tests/benchmarks/corelib/time/qtimezone/qtimezone.pro
+++ b/tests/benchmarks/corelib/time/qtimezone/qtimezone.pro
@@ -1,4 +1,5 @@
-TARGET = tst_bench_qtimezone
+CONFIG += benchmark
QT = core testlib
+TARGET = tst_bench_qtimezone
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro b/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
index 49edcbee70..89da01b02e 100644
--- a/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
+++ b/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
@@ -1,6 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_containers-associative
-
+CONFIG += benchmark
QT = core testlib
+TARGET = tst_bench_containers-associative
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro b/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
index 6f731cb6d8..509da95d22 100644
--- a/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
+++ b/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
@@ -1,6 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_containers-sequential
-
+CONFIG += benchmark
QT = core testlib
+TARGET = tst_bench_containers-sequential
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro b/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
index f54f8320d4..0bde3ac66a 100644
--- a/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
+++ b/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
@@ -1,3 +1,5 @@
-TARGET = tst_bench_qalgorithms
+CONFIG += benchmark
QT = core testlib
+
+TARGET = tst_bench_qalgorithms
SOURCES = tst_qalgorithms.cpp
diff --git a/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro b/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
index fe74dafef4..59adad6bbc 100644
--- a/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
+++ b/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
@@ -1,7 +1,6 @@
-TARGET = tst_bench_qcontiguouscache
-
-SOURCES += main.cpp
-
+CONFIG += benchmark
CONFIG += parallel_test
-
QT = core testlib
+
+TARGET = tst_bench_qcontiguouscache
+SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/tools/qcryptographichash/qcryptographichash.pro b/tests/benchmarks/corelib/tools/qcryptographichash/qcryptographichash.pro
index cf9d640f7e..025c70c2d9 100644
--- a/tests/benchmarks/corelib/tools/qcryptographichash/qcryptographichash.pro
+++ b/tests/benchmarks/corelib/tools/qcryptographichash/qcryptographichash.pro
@@ -1,5 +1,6 @@
-TARGET = tst_bench_qcryptographichash
-CONFIG -= debug
-CONFIG += release cmdline
+CONFIG += benchmark
+CONFIG += cmdline
QT = core testlib
+
+TARGET = tst_bench_qcryptographichash
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/tools/qhash/qhash.pro b/tests/benchmarks/corelib/tools/qhash/qhash.pro
index 40f661c116..f9a873d096 100644
--- a/tests/benchmarks/corelib/tools/qhash/qhash.pro
+++ b/tests/benchmarks/corelib/tools/qhash/qhash.pro
@@ -1,5 +1,6 @@
-TARGET = tst_hash
+CONFIG += benchmark
QT = core testlib
+
INCLUDEPATH += .
+TARGET = tst_hash
SOURCES += main.cpp outofline.cpp
-CONFIG += release
diff --git a/tests/benchmarks/corelib/tools/qlist/qlist.pro b/tests/benchmarks/corelib/tools/qlist/qlist.pro
index c83bc455d2..98767c3250 100644
--- a/tests/benchmarks/corelib/tools/qlist/qlist.pro
+++ b/tests/benchmarks/corelib/tools/qlist/qlist.pro
@@ -1,4 +1,5 @@
-TARGET = tst_bench_qlist
+CONFIG += benchmark
QT = core testlib
+TARGET = tst_bench_qlist
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/tools/qmap/qmap.pro b/tests/benchmarks/corelib/tools/qmap/qmap.pro
index 6c9bf5e8d6..0e06493c79 100644
--- a/tests/benchmarks/corelib/tools/qmap/qmap.pro
+++ b/tests/benchmarks/corelib/tools/qmap/qmap.pro
@@ -1,5 +1,6 @@
-TARGET = tst_bench_qmap
+CONFIG += benchmark
QT = core testlib
+
INCLUDEPATH += .
+TARGET = tst_bench_qmap
SOURCES += main.cpp
-CONFIG += release
diff --git a/tests/benchmarks/corelib/tools/qrect/qrect.pro b/tests/benchmarks/corelib/tools/qrect/qrect.pro
index 42cfcd8924..211cdc5bcc 100644
--- a/tests/benchmarks/corelib/tools/qrect/qrect.pro
+++ b/tests/benchmarks/corelib/tools/qrect/qrect.pro
@@ -1,7 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qrect
-
QT = core testlib
-CONFIG += release
+CONFIG += benchmark
+TARGET = tst_bench_qrect
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/tools/qringbuffer/qringbuffer.pro b/tests/benchmarks/corelib/tools/qringbuffer/qringbuffer.pro
index 21b50e10e5..69750865b5 100644
--- a/tests/benchmarks/corelib/tools/qringbuffer/qringbuffer.pro
+++ b/tests/benchmarks/corelib/tools/qringbuffer/qringbuffer.pro
@@ -1,7 +1,6 @@
TEMPLATE = app
-TARGET = tst_bench_qringbuffer
-
+CONFIG += benchmark
QT = core-private testlib
-CONFIG += release
+TARGET = tst_bench_qringbuffer
SOURCES += main.cpp
diff --git a/tests/benchmarks/corelib/tools/qset/qset.pro b/tests/benchmarks/corelib/tools/qset/qset.pro
index 8fb8bcfa0b..e448683e94 100644
--- a/tests/benchmarks/corelib/tools/qset/qset.pro
+++ b/tests/benchmarks/corelib/tools/qset/qset.pro
@@ -1,4 +1,5 @@
-TARGET = tst_qset
+CONFIG += benchmark
QT = core testlib
+
+TARGET = tst_qset
SOURCES += main.cpp
-CONFIG += release
diff --git a/tests/benchmarks/corelib/tools/qstack/qstack.pro b/tests/benchmarks/corelib/tools/qstack/qstack.pro
index 7d8a839610..17b7ebd486 100644
--- a/tests/benchmarks/corelib/tools/qstack/qstack.pro
+++ b/tests/benchmarks/corelib/tools/qstack/qstack.pro
@@ -1,4 +1,5 @@
-TARGET = tst_bench_stack
+CONFIG += benchmark
QT = core testlib core-private
+
+TARGET = tst_bench_stack
SOURCES += main.cpp
-CONFIG += release
diff --git a/tests/benchmarks/corelib/tools/qvector/qvector.pro b/tests/benchmarks/corelib/tools/qvector/qvector.pro
index 24a65d8ee8..fce8a6cd78 100644
--- a/tests/benchmarks/corelib/tools/qvector/qvector.pro
+++ b/tests/benchmarks/corelib/tools/qvector/qvector.pro
@@ -1,5 +1,6 @@
-TARGET = tst_bench_vector
+CONFIG += benchmark
QT = core testlib core-private
+
INCLUDEPATH += .
-SOURCES += main.cpp outofline.cpp
-CONFIG += release
+TARGET = tst_bench_vector
+SOURCES += main.cpp outofline.cpp