diff options
Diffstat (limited to 'tests/auto/corelib/serialization/qdatastream')
-rw-r--r-- | tests/auto/corelib/serialization/qdatastream/CMakeLists.txt | 24 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/qdatastream/gen_typedefq5.cpp | 28 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/qdatastream/qdatastream.pro | 13 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/qdatastream/testdata.qrc | 5 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp | 601 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/qdatastream/typedef.q5 | bin | 0 -> 28 bytes |
6 files changed, 422 insertions, 249 deletions
diff --git a/tests/auto/corelib/serialization/qdatastream/CMakeLists.txt b/tests/auto/corelib/serialization/qdatastream/CMakeLists.txt new file mode 100644 index 0000000000..ebbb232362 --- /dev/null +++ b/tests/auto/corelib/serialization/qdatastream/CMakeLists.txt @@ -0,0 +1,24 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +##################################################################### +## tst_qdatastream Test: +##################################################################### + +if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT) + cmake_minimum_required(VERSION 3.16) + project(tst_qdatastream LANGUAGES CXX) + find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST) +endif() + +# Collect test data +list(APPEND test_data "datastream.q42") +list(APPEND test_data "typedef.q5") + +qt_internal_add_test(tst_qdatastream + SOURCES + tst_qdatastream.cpp + LIBRARIES + Qt::Gui + TESTDATA ${test_data} +) diff --git a/tests/auto/corelib/serialization/qdatastream/gen_typedefq5.cpp b/tests/auto/corelib/serialization/qdatastream/gen_typedefq5.cpp new file mode 100644 index 0000000000..6cc2755d8a --- /dev/null +++ b/tests/auto/corelib/serialization/qdatastream/gen_typedefq5.cpp @@ -0,0 +1,28 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + + +#include <QDataStream> +#include <QPair> +#include <QFile> +#include <QVariant> +#include <QDebug> + +using CustomPair = QPair<int, int>; +QDataStream &operator<<(QDataStream &ds, CustomPair pd) +{ return ds << pd.first << pd.second; } +QDataStream &operator>>(QDataStream &ds, CustomPair &pd) +{ return ds >> pd.first >> pd.second; } +Q_DECLARE_METATYPE(CustomPair) + + +int main() { + qRegisterMetaTypeStreamOperators<CustomPair>(); + QFile out("typedef.q5"); + out.open(QIODevice::ReadWrite); + QDataStream stream(&out); + stream.setVersion(QDataStream::Qt_5_15); + CustomPair p {42, 100}; + qDebug() << p.first << p.second; + stream << QVariant::fromValue(p); +} diff --git a/tests/auto/corelib/serialization/qdatastream/qdatastream.pro b/tests/auto/corelib/serialization/qdatastream/qdatastream.pro deleted file mode 100644 index 469d689f3f..0000000000 --- a/tests/auto/corelib/serialization/qdatastream/qdatastream.pro +++ /dev/null @@ -1,13 +0,0 @@ -CONFIG += testcase -TARGET = tst_qdatastream -QT += testlib -SOURCES = tst_qdatastream.cpp - -DEFINES -= QT_NO_LINKED_LIST - -TESTDATA += datastream.q42 - -android:!android-embedded { - RESOURCES += \ - testdata.qrc -} diff --git a/tests/auto/corelib/serialization/qdatastream/testdata.qrc b/tests/auto/corelib/serialization/qdatastream/testdata.qrc deleted file mode 100644 index fb63cb3438..0000000000 --- a/tests/auto/corelib/serialization/qdatastream/testdata.qrc +++ /dev/null @@ -1,5 +0,0 @@ -<RCC> - <qresource prefix="/"> - <file>datastream.q42</file> - </qresource> -</RCC> diff --git a/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp index d402e3f63b..9a227c782d 100644 --- a/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp +++ b/tests/auto/corelib/serialization/qdatastream/tst_qdatastream.cpp @@ -1,39 +1,33 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** 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 General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** 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-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtTest/QtTest> +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QTest> +#include <QBuffer> +#include <QEasingCurve> +#include <QJsonValue> +#include <QJsonObject> +#include <QJsonArray> +#include <QJsonDocument> +#include <QtEndian> + #include <QtGui/QBitmap> +#include <QtGui/QPainter> +#include <QtGui/QPainterPath> #include <QtGui/QPalette> -#include <QtGui/QPixmap> +#include <QtGui/QPen> #include <QtGui/QPicture> +#include <QtGui/QPixmap> #include <QtGui/QTextLength> -#include <QtGui/QPainter> -#include <QtGui/QPen> + +using namespace Qt::StringLiterals; + +static_assert(QTypeTraits::has_ostream_operator_v<QDataStream, int>); +static_assert(QTypeTraits::has_ostream_operator_v<QDataStream, QList<int>>); +static_assert(QTypeTraits::has_ostream_operator_v<QDataStream, QMap<int, QString>>); +struct NonStreamable {}; +static_assert(!QTypeTraits::has_ostream_operator_v<QDataStream, NonStreamable>); +static_assert(!QTypeTraits::has_ostream_operator_v<QDataStream, QList<NonStreamable>>); +static_assert(!QTypeTraits::has_ostream_operator_v<QDataStream, QMap<int, NonStreamable>>); class tst_QDataStream : public QObject { @@ -110,9 +104,6 @@ private slots: void stream_QString_data(); void stream_QString(); - void stream_QRegExp_data(); - void stream_QRegExp(); - #if QT_CONFIG(regularexpression) void stream_QRegularExpression_data(); void stream_QRegularExpression(); @@ -121,9 +112,15 @@ private slots: void stream_Map_data(); void stream_Map(); + void stream_MultiMap_data(); + void stream_MultiMap(); + void stream_Hash_data(); void stream_Hash(); + void stream_MultiHash_data(); + void stream_MultiHash(); + void stream_qint64_data(); void stream_qint64(); @@ -137,6 +134,7 @@ private slots: void stream_atEnd(); void stream_writeError(); + void stream_writeSizeLimitExceeded(); void stream_QByteArray2(); @@ -145,9 +143,11 @@ private slots: void stream_QJsonObject(); void stream_QJsonValue(); +#if QT_CONFIG(cborstreamwriter) void stream_QCborArray(); void stream_QCborMap(); void stream_QCborValue(); +#endif void setVersion_data(); void setVersion(); @@ -180,7 +180,7 @@ private slots: void status_QHash_QMap(); - void status_QLinkedList_QList_QVector(); + void status_QList_QVector(); void streamToAndFromQByteArray(); @@ -201,6 +201,8 @@ private slots: void nestedTransactionsResult_data(); void nestedTransactionsResult(); + void typedefQt5Compat(); + private: void writebool(QDataStream *s); void writeQBitArray(QDataStream *s); @@ -225,12 +227,13 @@ private: void writeQRegion(QDataStream *s); void writeQSize(QDataStream *s); void writeQString(QDataStream* dev); - void writeQRegExp(QDataStream* dev); #if QT_CONFIG(regularexpression) void writeQRegularExpression(QDataStream *dev); #endif void writeMap(QDataStream* dev); + void writeMultiMap(QDataStream* dev); void writeHash(QDataStream* dev); + void writeMultiHash(QDataStream* dev); void writeqint64(QDataStream *s); void writeQIcon(QDataStream *s); void writeQEasingCurve(QDataStream *s); @@ -257,12 +260,13 @@ private: void readQRegion(QDataStream *s); void readQSize(QDataStream *s); void readQString(QDataStream *s); - void readQRegExp(QDataStream *s); #if QT_CONFIG(regularexpression) void readQRegularExpression(QDataStream *s); #endif void readMap(QDataStream *s); + void readMultiMap(QDataStream *s); void readHash(QDataStream *s); + void readMultiHash(QDataStream *s); void readqint64(QDataStream *s); void readQIcon(QDataStream *s); void readQEasingCurve(QDataStream *s); @@ -292,7 +296,10 @@ static int NColorRoles[] = { QPalette::ToolTipText + 1, // Qt_5_4, Qt_5_5 QPalette::ToolTipText + 1, // Qt_5_6, Qt_5_7, Qt_5_8, Qt_5_9, Qt_5_10, Qt_5_11 QPalette::PlaceholderText + 1, // Qt_5_12 - QPalette::PlaceholderText + 1, // Qt_5_13 + QPalette::PlaceholderText + 1, // Qt_5_13, Qt_5_14, Qt_5_15 + QPalette::PlaceholderText + 1, // Qt_6_0 + QPalette::Accent + 1, // Qt_6_6 + QPalette::Accent + 1, // Qt_6_7 0 // add the correct value for Qt_5_14 here later }; @@ -507,71 +514,6 @@ void tst_QDataStream::readQString(QDataStream *s) // ************************************ -static QRegExp QRegExpData(int index) -{ - switch (index) { - case 0: return QRegExp(); - case 1: return QRegExp(""); - case 2: return QRegExp("A", Qt::CaseInsensitive); - case 3: return QRegExp("ABCDE FGHI", Qt::CaseSensitive, QRegExp::Wildcard); - case 4: return QRegExp("This is a long string", Qt::CaseInsensitive, QRegExp::FixedString); - case 5: return QRegExp("And again a string with a \nCRLF", Qt::CaseInsensitive, QRegExp::RegExp); - case 6: - { - QRegExp rx("abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRESTUVWXYZ 1234567890 ~`!@#$%^&*()_-+={[}]|\\:;\"'<,>.?/"); - rx.setMinimal(true); - return rx; - } - } - return QRegExp("foo"); -} -#define MAX_QREGEXP_DATA 7 - -void tst_QDataStream::stream_QRegExp_data() -{ - stream_data(MAX_QREGEXP_DATA); -} - -void tst_QDataStream::stream_QRegExp() -{ - STREAM_IMPL(QRegExp); -} - -void tst_QDataStream::writeQRegExp(QDataStream* s) -{ - QRegExp test(QRegExpData(dataIndex(QTest::currentDataTag()))); - *s << test; - *s << QString("Her er det noe tekst"); - *s << test; - *s << QString("nonempty"); - *s << test; - *s << QVariant(test); -} - -void tst_QDataStream::readQRegExp(QDataStream *s) -{ - QRegExp R; - QString S; - QVariant V; - QRegExp test(QRegExpData(dataIndex(QTest::currentDataTag()))); - - *s >> R; - QCOMPARE(R, test); - *s >> S; - QCOMPARE(S, QString("Her er det noe tekst")); - *s >> R; - QCOMPARE(R, test); - *s >> S; - QCOMPARE(S, QString("nonempty")); - *s >> R; - QCOMPARE(R, test); - *s >> V; - QCOMPARE(V.type(), QVariant::RegExp); - QCOMPARE(V.toRegExp(), test); -} - -// ************************************ - #if QT_CONFIG(regularexpression) static QRegularExpression QRegularExpressionData(int index) { @@ -628,7 +570,7 @@ void tst_QDataStream::readQRegularExpression(QDataStream *s) *s >> R; QCOMPARE(R, test); *s >> V; - QCOMPARE(V.type(), QVariant::RegularExpression); + QCOMPARE(V.userType(), QMetaType::QRegularExpression); QCOMPARE(V.toRegularExpression(), test); } #endif //QT_CONFIG(regularexpression) @@ -650,16 +592,10 @@ static Map MapData(int index) map.insert(2, "bbb"); map.insert(3, "cccccc"); break; - case 2: - map.insert(1, "a"); - map.insert(2, "one"); - map.insertMulti(2, "two"); - map.insertMulti(2, "three"); - map.insert(3, "cccccc"); } return map; } -#define MAX_MAP_DATA 3 +#define MAX_MAP_DATA 2 void tst_QDataStream::stream_Map_data() { @@ -689,6 +625,60 @@ void tst_QDataStream::readMap(QDataStream *s) QCOMPARE(S, test); } +typedef QMultiMap<int, QString> MultiMap; + +static MultiMap MultiMapData(int index) +{ + MultiMap map; + + switch (index) { + case 0: + default: + break; + case 1: + map.insert(1, "a"); + map.insert(2, "bbb"); + map.insert(3, "cccccc"); + break; + case 2: + map.insert(1, "a"); + map.insert(2, "one"); + map.insert(2, "two"); + map.insert(2, "three"); + map.insert(3, "cccccc"); + } + return map; +} +#define MAX_MULTIMAP_DATA 3 + +void tst_QDataStream::stream_MultiMap_data() +{ + stream_data(MAX_MULTIMAP_DATA); +} + +void tst_QDataStream::stream_MultiMap() +{ + STREAM_IMPL(MultiMap); +} + +void tst_QDataStream::writeMultiMap(QDataStream* s) +{ + MultiMap test(MultiMapData(dataIndex(QTest::currentDataTag()))); + *s << test; + *s << test; +} + +void tst_QDataStream::readMultiMap(QDataStream *s) +{ + MultiMap S; + MultiMap test(MultiMapData(dataIndex(QTest::currentDataTag()))); + + *s >> S; + QCOMPARE(S, test); + *s >> S; + QCOMPARE(S, test); +} + // ************************************ typedef QHash<int, QString> Hash; @@ -706,16 +696,10 @@ static Hash HashData(int index) map.insert(2, "bbb"); map.insert(3, "cccccc"); break; - case 2: - map.insert(1, "a"); - map.insert(2, "one"); - map.insertMulti(2, "two"); - map.insertMulti(2, "three"); - map.insert(3, "cccccc"); } return map; } -#define MAX_HASH_DATA 3 +#define MAX_HASH_DATA 2 void tst_QDataStream::stream_Hash_data() { @@ -745,6 +729,60 @@ void tst_QDataStream::readHash(QDataStream *s) QCOMPARE(S, test); } +typedef QMultiHash<int, QString> MultiHash; + +static MultiHash MultiHashData(int index) +{ + MultiHash map; + + switch (index) { + case 0: + default: + break; + case 1: + map.insert(1, "a"); + map.insert(2, "bbb"); + map.insert(3, "cccccc"); + break; + case 2: + map.insert(1, "a"); + map.insert(2, "one"); + map.insert(2, "two"); + map.insert(2, "three"); + map.insert(3, "cccccc"); + } + return map; +} +#define MAX_MULTIHASH_DATA 3 + +void tst_QDataStream::stream_MultiHash_data() +{ + stream_data(MAX_HASH_DATA); +} + +void tst_QDataStream::stream_MultiHash() +{ + STREAM_IMPL(MultiHash); +} + +void tst_QDataStream::writeMultiHash(QDataStream* s) +{ + MultiHash test(MultiHashData(dataIndex(QTest::currentDataTag()))); + *s << test; + *s << test; +} + +void tst_QDataStream::readMultiHash(QDataStream *s) +{ + MultiHash S; + MultiHash test(MultiHashData(dataIndex(QTest::currentDataTag()))); + + *s >> S; + QCOMPARE(S, test); + *s >> S; + QCOMPARE(S, test); +} + // ************************************ static QEasingCurve QEasingCurveData(int index) @@ -927,10 +965,10 @@ static void QBitArrayData(QBitArray *b, int index) case 18: filler = "1111111111111111111111111111111111111111111111111111111111111111"; break; } - b->resize(filler.length()); + b->resize(filler.size()); b->fill(0); // reset all bits to zero - for (int i = 0; i < filler.length(); ++i) { + for (int i = 0; i < filler.size(); ++i) { if (filler.at(i) == '1') b->setBit(i, true); } @@ -1130,7 +1168,7 @@ static QCursor qCursorData(int index) case 3: return QCursor(Qt::BlankCursor); case 4: return QCursor(Qt::BlankCursor); case 5: return QCursor(QPixmap(open_xpm), 1, 1); - case 6: { QPixmap pm(open_xpm); return QCursor(QBitmap(pm), pm.mask(), 3, 4); } + case 6: { QPixmap pm(open_xpm); return QCursor(QBitmap::fromPixmap(pm), pm.mask(), 3, 4); } case 7: return QCursor(QPixmap(open_xpm), -1, 5); case 8: return QCursor(QPixmap(open_xpm), 5, -1); } @@ -1170,18 +1208,18 @@ void tst_QDataStream::readQCursor(QDataStream *s) QVERIFY(d5.shape() == test.shape()); //## lacks operator== QCOMPARE(d5.hotSpot(), test.hotSpot()); - QVERIFY((d5.bitmap() != 0 && test.bitmap() != 0) || (d5.bitmap() == 0 && test.bitmap() == 0)); - if (d5.bitmap() != 0) { - QPixmap actual = *(d5.bitmap()); - QPixmap expected = *(test.bitmap()); - QCOMPARE(actual, expected); - } - QVERIFY((d5.mask() != 0 && test.mask() != 0) || (d5.mask() == 0 && test.mask() == 0)); - if (d5.mask() != 0) { - QPixmap actual = *(d5.mask()); - QPixmap expected = *(test.mask()); - QCOMPARE(actual, expected); - } + + // Comparing non-null QBitmaps will fail. Upcast them first to pass. + QCOMPARE(d5.bitmap().isNull(), test.bitmap().isNull()); + QCOMPARE( + static_cast<QPixmap>(d5.bitmap()), + static_cast<QPixmap>(test.bitmap()) + ); + QCOMPARE(d5.mask().isNull(), test.mask().isNull()); + QCOMPARE( + static_cast<QPixmap>(d5.mask()), + static_cast<QPixmap>(test.mask()) + ); } #endif @@ -2109,7 +2147,7 @@ void tst_QDataStream::stream_atEnd() class FakeBuffer : public QBuffer { protected: - qint64 writeData(const char *c, qint64 i) { return m_lock ? 0 : QBuffer::writeData(c, i); } + qint64 writeData(const char *c, qint64 i) override { return m_lock ? 0 : QBuffer::writeData(c, i); } public: FakeBuffer(bool locked = false) : m_lock(locked) {} void setLocked(bool locked) { m_lock = locked; } @@ -2155,6 +2193,19 @@ void tst_QDataStream::stream_writeError() TEST_WRITE_ERROR(.writeRawData("test", 4)) } +void tst_QDataStream::stream_writeSizeLimitExceeded() +{ + QByteArray ba; + QDataStream ds(&ba, QDataStream::ReadWrite); + // Set the version that supports only 32-bit data size + ds.setVersion(QDataStream::Qt_6_6); + QCOMPARE(ds.status(), QDataStream::Ok); + const qint64 size = qint64(std::numeric_limits<quint32>::max()) + 1; + ds.writeBytes("", size); + QCOMPARE(ds.status(), QDataStream::SizeLimitExceeded); + QVERIFY(ba.isEmpty()); +} + void tst_QDataStream::stream_QByteArray2() { QByteArray ba; @@ -2277,6 +2328,7 @@ void tst_QDataStream::stream_QJsonValue() } } +#if QT_CONFIG(cborstreamwriter) void tst_QDataStream::stream_QCborArray() { QByteArray buffer; @@ -2312,6 +2364,7 @@ void tst_QDataStream::stream_QCborValue() load >> valueLoad; QCOMPARE(valueLoad, valueSave); } +#endif void tst_QDataStream::setVersion_data() { @@ -2359,8 +2412,8 @@ void tst_QDataStream::setVersion() */ // revise the test if new color roles or color groups are added - QVERIFY(QPalette::NColorRoles == QPalette::PlaceholderText + 1); - QCOMPARE(int(QPalette::NColorGroups), 3); + QCOMPARE(QPalette::NColorRoles, QPalette::Accent + 1); + QCOMPARE(static_cast<int>(QPalette::NColorGroups), 3); QByteArray ba2; QPalette pal1, pal2; @@ -2480,7 +2533,7 @@ void tst_QDataStream::skipRawData() QFETCH(char, expect); qint8 dummy; - QIODevice *dev = 0; + QIODevice *dev = nullptr; if (deviceType == "sequential") { dev = new SequentialBuffer(&data); } else if (deviceType == "random-access") { @@ -2761,7 +2814,6 @@ void tst_QDataStream::status_charptr_QByteArray_data() QTest::newRow("badsize 1MB+1") << QByteArray("\x00\x10\x00\x01", 4) + oneMbMinus1 + QByteArray("j") << (int) QDataStream::ReadPastEnd << QByteArray(); QTest::newRow("badsize 3MB") << QByteArray("\x00\x30\x00\x00", 4) + threeMbMinus1 << (int) QDataStream::ReadPastEnd << QByteArray(); QTest::newRow("badsize 3MB+1") << QByteArray("\x00\x30\x00\x01", 4) + threeMbMinus1 + QByteArray("j") << (int) QDataStream::ReadPastEnd << QByteArray(); - QTest::newRow("size -1") << QByteArray("\xff\xff\xff\xff", 4) << (int) QDataStream::ReadPastEnd << QByteArray(); QTest::newRow("size -2") << QByteArray("\xff\xff\xff\xfe", 4) << (int) QDataStream::ReadPastEnd << QByteArray(); } @@ -2784,17 +2836,35 @@ void tst_QDataStream::status_charptr_QByteArray() { QDataStream stream(&data, QIODevice::ReadOnly); char *buf; - uint len; + qint64 len; stream.readBytes(buf, len); - QCOMPARE((int)len, expectedString.size()); + QCOMPARE(len, qint64(expectedString.size())); QCOMPARE(QByteArray(buf, len), expectedString); QCOMPARE(int(stream.status()), expectedStatus); delete [] buf; } +#if QT_DEPRECATED_SINCE(6, 11) +QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED { + // check that old overload still works as expected QDataStream stream(&data, QIODevice::ReadOnly); - QByteArray buf; + char *buf; + auto cleanup = qScopeGuard([&buf] { + delete [] buf; + }); + uint len; + stream.readBytes(buf, len); + + QCOMPARE(len, expectedString.size()); + QCOMPARE(QByteArray(buf, len), expectedString); + QCOMPARE(int(stream.status()), expectedStatus); + } +QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 11) + { + QDataStream stream(&data, QIODevice::ReadOnly); + QByteArray buf = "Content to be overwritten"; stream >> buf; if (data.startsWith("\xff\xff\xff\xff")) { @@ -2828,7 +2898,7 @@ void tst_QDataStream::status_QString_data() QString oneMbMinus1; oneMbMinus1.resize(1024 * 1024 - 1); for (int i = 0; i < oneMbMinus1.size(); ++i) - oneMbMinus1[i] = 0x1 | (8 * ((uchar)i / 9)); + oneMbMinus1[i] = QChar(0x1 | (8 * ((uchar)i / 9))); QString threeMbMinus1 = oneMbMinus1 + QChar('j') + oneMbMinus1 + QChar('k') + oneMbMinus1; QByteArray threeMbMinus1Data = qstring2qbytearray(threeMbMinus1); @@ -2863,12 +2933,20 @@ void tst_QDataStream::status_QString_data() QTest::newRow("badsize 1MB+1") << QByteArray("\x00\x20\x00\x02", 4) + oneMbMinus1Data + QByteArray("j") << (int) QDataStream::ReadPastEnd << QString(); QTest::newRow("badsize 3MB") << QByteArray("\x00\x60\x00\x00", 4) + threeMbMinus1Data << (int) QDataStream::ReadPastEnd << QString(); QTest::newRow("badsize 3MB+1") << QByteArray("\x00\x60\x00\x02", 4) + threeMbMinus1Data + QByteArray("j") << (int) QDataStream::ReadPastEnd << QString(); - QTest::newRow("size -2") << QByteArray("\xff\xff\xff\xfe", 4) << (int) QDataStream::ReadPastEnd << QString(); - QTest::newRow("size MAX") << QByteArray("\x7f\xff\xff\xfe", 4) << (int) QDataStream::ReadPastEnd << QString(); + QTest::newRow("32 bit size should be 64 bit") << QByteArray("\xff\xff\xff\xfe", 4) << (int) QDataStream::ReadPastEnd << QString(); - // corrupt data +#if QT_POINTER_SIZE != 4 + // past end on 64 bit platforms + QTest::newRow("32 bit size MAX string no content") << QByteArray("\xff\xff\xff\xfc", 4) << (int) QDataStream::ReadPastEnd << QString(); +#else + // too big for 32 bit platforms + QTest::newRow("32 bit size MAX string no content") << QByteArray("\xff\xff\xff\xfc", 4) << (int) QDataStream::SizeLimitExceeded << QString(); +#endif + // too big on both 32 and 64 bit platforms because qsizetype is signed + QTest::newRow("64 bit size MAX string no content") << QByteArray("\xff\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\xfe", 12) << (int) QDataStream::SizeLimitExceeded << QString(); + + // corrupt data because QChar is 16 bit => even size required QTest::newRow("corrupt1") << QByteArray("yyyy") << (int) QDataStream::ReadCorruptData << QString(); - QTest::newRow("size -3") << QByteArray("\xff\xff\xff\xfd", 4) << (int) QDataStream::ReadCorruptData << QString(); } void tst_QDataStream::status_QString() @@ -2878,7 +2956,7 @@ void tst_QDataStream::status_QString() QFETCH(QString, expectedString); QDataStream stream(&data, QIODevice::ReadOnly); - QString str; + QString str = "Content to be overwritten"; stream >> str; QCOMPARE(str.size(), expectedString.size()); @@ -2896,72 +2974,90 @@ static QBitArray bitarray(const QString &str) void tst_QDataStream::status_QBitArray_data() { + QTest::addColumn<QDataStream::Version>("version"); QTest::addColumn<QByteArray>("data"); QTest::addColumn<int>("expectedStatus"); QTest::addColumn<QBitArray>("expectedString"); // ok - QTest::newRow("size 0") << QByteArray("\x00\x00\x00\x00", 4) << (int) QDataStream::Ok << QBitArray(); - QTest::newRow("size 1a") << QByteArray("\x00\x00\x00\x01\x00", 5) << (int) QDataStream::Ok << bitarray("0"); - QTest::newRow("size 1b") << QByteArray("\x00\x00\x00\x01\x01", 5) << (int) QDataStream::Ok << bitarray("1"); - QTest::newRow("size 2") << QByteArray("\x00\x00\x00\x02\x03", 5) << (int) QDataStream::Ok << bitarray("11"); - QTest::newRow("size 3") << QByteArray("\x00\x00\x00\x03\x07", 5) << (int) QDataStream::Ok << bitarray("111"); - QTest::newRow("size 4") << QByteArray("\x00\x00\x00\x04\x0f", 5) << (int) QDataStream::Ok << bitarray("1111"); - QTest::newRow("size 5") << QByteArray("\x00\x00\x00\x05\x1f", 5) << (int) QDataStream::Ok << bitarray("11111"); - QTest::newRow("size 6") << QByteArray("\x00\x00\x00\x06\x3f", 5) << (int) QDataStream::Ok << bitarray("111111"); - QTest::newRow("size 7a") << QByteArray("\x00\x00\x00\x07\x7f", 5) << (int) QDataStream::Ok << bitarray("1111111"); - QTest::newRow("size 7b") << QByteArray("\x00\x00\x00\x07\x7e", 5) << (int) QDataStream::Ok << bitarray("0111111"); - QTest::newRow("size 7c") << QByteArray("\x00\x00\x00\x07\x00", 5) << (int) QDataStream::Ok << bitarray("0000000"); - QTest::newRow("size 7d") << QByteArray("\x00\x00\x00\x07\x39", 5) << (int) QDataStream::Ok << bitarray("1001110"); - QTest::newRow("size 8") << QByteArray("\x00\x00\x00\x08\xff", 5) << (int) QDataStream::Ok << bitarray("11111111"); - QTest::newRow("size 9") << QByteArray("\x00\x00\x00\x09\xff\x01", 6) << (int) QDataStream::Ok << bitarray("111111111"); - QTest::newRow("size 15") << QByteArray("\x00\x00\x00\x0f\xff\x7f", 6) << (int) QDataStream::Ok << bitarray("111111111111111"); - QTest::newRow("size 16") << QByteArray("\x00\x00\x00\x10\xff\xff", 6) << (int) QDataStream::Ok << bitarray("1111111111111111"); - QTest::newRow("size 17") << QByteArray("\x00\x00\x00\x11\xff\xff\x01", 7) << (int) QDataStream::Ok << bitarray("11111111111111111"); - QTest::newRow("size 32") << QByteArray("\x00\x00\x00\x20\xff\xff\xff\xff", 8) << (int) QDataStream::Ok << bitarray("11111111111111111111111111111111"); + QTest::newRow("size 0") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x00", 4) << (int) QDataStream::Ok << QBitArray(); + QTest::newRow("size 1a") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x00", 5) << (int) QDataStream::Ok << bitarray("0"); + QTest::newRow("size 1b") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x01", 5) << (int) QDataStream::Ok << bitarray("1"); + QTest::newRow("size 2") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x02\x03", 5) << (int) QDataStream::Ok << bitarray("11"); + QTest::newRow("size 3") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x03\x07", 5) << (int) QDataStream::Ok << bitarray("111"); + QTest::newRow("size 4") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x04\x0f", 5) << (int) QDataStream::Ok << bitarray("1111"); + QTest::newRow("size 5") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x05\x1f", 5) << (int) QDataStream::Ok << bitarray("11111"); + QTest::newRow("size 6") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x06\x3f", 5) << (int) QDataStream::Ok << bitarray("111111"); + QTest::newRow("size 7a") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x07\x7f", 5) << (int) QDataStream::Ok << bitarray("1111111"); + QTest::newRow("size 7b") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x07\x7e", 5) << (int) QDataStream::Ok << bitarray("0111111"); + QTest::newRow("size 7c") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x07\x00", 5) << (int) QDataStream::Ok << bitarray("0000000"); + QTest::newRow("size 7d") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x07\x39", 5) << (int) QDataStream::Ok << bitarray("1001110"); + QTest::newRow("size 8") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x08\xff", 5) << (int) QDataStream::Ok << bitarray("11111111"); + QTest::newRow("size 9") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x09\xff\x01", 6) << (int) QDataStream::Ok << bitarray("111111111"); + QTest::newRow("size 15") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x0f\xff\x7f", 6) << (int) QDataStream::Ok << bitarray("111111111111111"); + QTest::newRow("size 16") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x10\xff\xff", 6) << (int) QDataStream::Ok << bitarray("1111111111111111"); + QTest::newRow("size 17") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x11\xff\xff\x01", 7) << (int) QDataStream::Ok << bitarray("11111111111111111"); + QTest::newRow("size 32") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x20\xff\xff\xff\xff", 8) << (int) QDataStream::Ok << bitarray("11111111111111111111111111111111"); + + + QTest::newRow("new size 0") << QDataStream::Qt_6_0 << QByteArray("\x00\x00\x00\x00\x00\x00\x00\x00", 8) << (int) QDataStream::Ok << QBitArray(); + QTest::newRow("new size 1a") << QDataStream::Qt_6_0 << QByteArray("\x00\x00\x00\x00\x00\x00\x00\x01\x00", 9) << (int) QDataStream::Ok << bitarray("0"); + QTest::newRow("new size 1b") << QDataStream::Qt_6_0 << QByteArray("\x00\x00\x00\x00\x00\x00\x00\x01\x01", 9) << (int) QDataStream::Ok << bitarray("1"); + QTest::newRow("new size 32") << QDataStream::Qt_6_0 << QByteArray("\x00\x00\x00\x00\x00\x00\x00\x20\xff\xff\xff\xff", 12) << (int) QDataStream::Ok << bitarray("11111111111111111111111111111111"); // past end - QTest::newRow("empty") << QByteArray() << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("badsize 0a") << QByteArray("\x00", 1) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("badsize 0b") << QByteArray("\x00\x00", 2) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("badsize 0c") << QByteArray("\x00\x00\x00", 3) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("badsize 1") << QByteArray("\x00\x00\x00\x01", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("badsize 2") << QByteArray("\x00\x00\x00\x02", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("badsize 3") << QByteArray("\x00\x00\x00\x03", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("badsize 7") << QByteArray("\x00\x00\x00\x04", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("size 8") << QByteArray("\x00\x00\x00\x08", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("size 9") << QByteArray("\x00\x00\x00\x09\xff", 5) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("size 15") << QByteArray("\x00\x00\x00\x0f\xff", 5) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("size 16") << QByteArray("\x00\x00\x00\x10\xff", 5) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("size 17") << QByteArray("\x00\x00\x00\x11\xff\xff", 6) << (int) QDataStream::ReadPastEnd << QBitArray(); - QTest::newRow("size 32") << QByteArray("\x00\x00\x00\x20\xff\xff\xff", 7) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("empty") << QDataStream::Qt_5_15 << QByteArray() << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 0a") << QDataStream::Qt_5_15 << QByteArray("\x00", 1) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 0b") << QDataStream::Qt_5_15 << QByteArray("\x00\x00", 2) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 0c") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00", 3) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 1") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 2") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x02", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 3") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x03", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 7") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x07", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 8") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x08", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 9") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x09\xff", 5) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 15") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x0f\xff", 5) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 16") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x10\xff", 5) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 17") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x11\xff\xff", 6) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize 32") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x20\xff\xff\xff", 7) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("badsize INT_MAX") << QDataStream::Qt_5_15 << QByteArray("\x7f\xff\xff\xff\xff\xff\xff", 7) << int(QDataStream::ReadPastEnd) << QBitArray(); // size accepted + QTest::addRow("badsize INT_MAX + 1") << QDataStream::Qt_5_15 << QByteArray("\x80\x00\x00\x01" "\xff\xff\xff", 7) << int(QDataStream::ReadCorruptData) << QBitArray(); // size rejected + QTest::newRow("new badsize 0") << QDataStream::Qt_6_0 << QByteArray("\x00\x00\x00\x00", 4) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("new badsize 9") << QDataStream::Qt_6_0 << QByteArray("\x00\x00\x00\x00\x00\x00\x00\x09\xff", 9) << (int) QDataStream::ReadPastEnd << QBitArray(); + QTest::newRow("new badsize 0x10000") << QDataStream::Qt_6_0 << QByteArray("\x00\x00\x00\x01\x00\x00\x00\x00\x00", 9) << (int) QDataStream::ReadPastEnd << QBitArray(); // corrupt data - QTest::newRow("junk 1a") << QByteArray("\x00\x00\x00\x01\x02", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 1b") << QByteArray("\x00\x00\x00\x01\x04", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 1c") << QByteArray("\x00\x00\x00\x01\x08", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 1d") << QByteArray("\x00\x00\x00\x01\x10", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 1e") << QByteArray("\x00\x00\x00\x01\x20", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 1f") << QByteArray("\x00\x00\x00\x01\x40", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 1g") << QByteArray("\x00\x00\x00\x01\x80", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 2") << QByteArray("\x00\x00\x00\x02\x04", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 3") << QByteArray("\x00\x00\x00\x03\x08", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 4") << QByteArray("\x00\x00\x00\x04\x10", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 5") << QByteArray("\x00\x00\x00\x05\x20", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 6") << QByteArray("\x00\x00\x00\x06\x40", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); - QTest::newRow("junk 7") << QByteArray("\x00\x00\x00\x07\x80", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 1a") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x02", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 1b") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x04", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 1c") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x08", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 1d") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x10", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 1e") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x20", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 1f") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x40", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 1g") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x01\x80", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 2") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x02\x04", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 3") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x03\x08", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 4") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x04\x10", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 5") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x05\x20", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 6") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x06\x40", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); + QTest::newRow("junk 7") << QDataStream::Qt_5_15 << QByteArray("\x00\x00\x00\x07\x80", 5) << (int) QDataStream::ReadCorruptData << QBitArray(); } void tst_QDataStream::status_QBitArray() { + QFETCH(QDataStream::Version, version); QFETCH(QByteArray, data); QFETCH(int, expectedStatus); QFETCH(QBitArray, expectedString); QDataStream stream(&data, QIODevice::ReadOnly); - QBitArray str; + stream.setVersion(version); + QBitArray str(255, true); stream >> str; + if (sizeof(qsizetype) == sizeof(int)) + QEXPECT_FAIL("new badsize 0x10000", "size > INT_MAX fails on 32bit system (QTBUG-87660)", + Continue); + QCOMPARE(int(stream.status()), expectedStatus); QCOMPARE(str.size(), expectedString.size()); QCOMPARE(str, expectedString); @@ -3022,7 +3118,9 @@ void tst_QDataStream::status_QHash_QMap() hash2.insert("L", "MN"); // ok + hash = hash2; MAP_TEST(QByteArray("\x00\x00\x00\x00", 4), QDataStream::Ok, QDataStream::Ok, StringHash()); + hash = hash2; MAP_TEST(QByteArray("\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", 12), QDataStream::Ok, QDataStream::Ok, hash1); MAP_TEST(QByteArray("\x00\x00\x00\x02\x00\x00\x00\x02\x00J\x00\x00\x00\x02\x00K" "\x00\x00\x00\x02\x00L\x00\x00\x00\x04\x00M\x00N", 30), QDataStream::Ok, QDataStream::Ok, hash2); @@ -3066,24 +3164,6 @@ void tst_QDataStream::status_QHash_QMap() } \ } \ { \ - LinkedList expectedLinkedList; \ - for (int i = 0; i < expectedList.count(); ++i) \ - expectedLinkedList << expectedList.at(i); \ - QByteArray ba = byteArray; \ - QDataStream stream(&ba, QIODevice::ReadOnly); \ - if (inTransaction) \ - stream.startTransaction(); \ - stream.setStatus(initialStatus); \ - stream >> linkedList; \ - QCOMPARE((int)stream.status(), (int)expectedStatus); \ - if (!inTransaction || stream.commitTransaction()) { \ - QCOMPARE(linkedList.size(), expectedLinkedList.size()); \ - QCOMPARE(linkedList, expectedLinkedList); \ - } else { \ - QVERIFY(linkedList.isEmpty()); \ - } \ - } \ - { \ Vector expectedVector; \ for (int i = 0; i < expectedList.count(); ++i) \ expectedVector << expectedList.at(i); \ @@ -3105,12 +3185,10 @@ void tst_QDataStream::status_QHash_QMap() break; \ } -void tst_QDataStream::status_QLinkedList_QList_QVector() +void tst_QDataStream::status_QList_QVector() { - typedef QLinkedList<QString> LinkedList; typedef QList<QString> List; - typedef QVector<QString> Vector; - LinkedList linkedList; + typedef QList<QString> Vector; List list; Vector vector; @@ -3123,7 +3201,9 @@ void tst_QDataStream::status_QLinkedList_QList_QVector() someList.append("J"); someList.append("MN"); + list = someList; LIST_TEST(QByteArray("\x00\x00\x00\x00", 4), QDataStream::Ok, QDataStream::Ok, List()); + list = someList; LIST_TEST(QByteArray("\x00\x00\x00\x01\x00\x00\x00\x00", 8), QDataStream::Ok, QDataStream::Ok, listWithEmptyString); LIST_TEST(QByteArray("\x00\x00\x00\x02\x00\x00\x00\x02\x00J" "\x00\x00\x00\x04\x00M\x00N", 18), QDataStream::Ok, QDataStream::Ok, someList); @@ -3178,11 +3258,13 @@ void tst_QDataStream::streamRealDataTypes() // Generate QPicture from pixmap. QPixmap pm(open_xpm); QVERIFY(!pm.isNull()); +#ifndef QT_NO_PICTURE QPicture picture; picture.setBoundingRect(QRect(QPoint(0, 0), pm.size())); QPainter painter(&picture); painter.drawPixmap(0, 0, pm); painter.end(); +#endif // Generate path QPainterPath path; @@ -3191,6 +3273,13 @@ void tst_QDataStream::streamRealDataTypes() path.arcTo(4, 5, 6, 7, 8, 9); path.quadTo(1, 2, 3, 4); + QPainterPath otherPath; + otherPath.arcTo(10, 4, 5, 6, 7, 8); + otherPath.lineTo(9, 0); + otherPath.cubicTo(0, 0, 10, 10, 20, 20); + otherPath.quadTo(2, 4, 5, 6); + QCOMPARE(otherPath.elementCount(), 12); + QColor color(64, 64, 64); color.setAlphaF(0.5); QRadialGradient radialGradient(5, 6, 7, 8, 9); @@ -3211,9 +3300,11 @@ void tst_QDataStream::streamRealDataTypes() stream.setVersion(QDataStream::Qt_4_2); stream << qreal(0) << qreal(1.0) << qreal(1.1) << qreal(3.14) << qreal(-3.14) << qreal(-1); stream << QPointF(3, 5) << QRectF(-1, -2, 3, 4) << (QPolygonF() << QPointF(0, 0) << QPointF(1, 2)); - stream << QMatrix().rotate(90).scale(2, 2); + stream << QTransform().rotate(90).scale(2, 2).asAffineMatrix(); stream << path; +#ifndef QT_NO_PICTURE stream << picture; +#endif stream << QTextLength(QTextLength::VariableLength, 1.5); stream << color; stream << radialBrush << conicalBrush; @@ -3222,17 +3313,19 @@ void tst_QDataStream::streamRealDataTypes() file.close(); } - QPointF point; - QRectF rect; - QPolygonF polygon; - QMatrix matrix; - QPainterPath p; + QPointF point(1, 2); + QRectF rect(1, 2, 5, 6); + QPolygonF polygon {{3, 4}, {5, 6}}; + QTransform transform; + QPainterPath p = otherPath; +#ifndef QT_NO_PICTURE QPicture pict; - QTextLength textLength; - QColor col; - QBrush rGrad; - QBrush cGrad; - QPen pen; +#endif + QTextLength textLength(QTextLength::FixedLength, 2.5); + QColor col(128, 128, 127); + QBrush rGrad(Qt::CrossPattern); + QBrush cGrad(Qt::CrossPattern); + QPen pen(conicalBrush, 10); QVERIFY(file.open(QIODevice::ReadOnly)); QDataStream stream(&file); @@ -3274,11 +3367,13 @@ void tst_QDataStream::streamRealDataTypes() stream >> rect; QCOMPARE(rect, QRectF(-1, -2, 3, 4)); stream >> polygon; - QCOMPARE((QVector<QPointF> &)polygon, (QPolygonF() << QPointF(0, 0) << QPointF(1, 2))); + QCOMPARE((QList<QPointF> &)polygon, (QPolygonF() << QPointF(0, 0) << QPointF(1, 2))); + auto matrix = transform.asAffineMatrix(); stream >> matrix; - QCOMPARE(matrix, QMatrix().rotate(90).scale(2, 2)); + QCOMPARE(transform, QTransform().rotate(90).scale(2, 2)); stream >> p; QCOMPARE(p, path); +#ifndef QT_NO_PICTURE if (i == 1) { stream >> pict; @@ -3292,13 +3387,14 @@ void tst_QDataStream::streamRealDataTypes() QCOMPARE(pictA, pictB); } +#endif stream >> textLength; QCOMPARE(textLength, QTextLength(QTextLength::VariableLength, 1.5)); stream >> col; QCOMPARE(col, color); stream >> rGrad; QCOMPARE(rGrad.style(), radialBrush.style()); - QCOMPARE(rGrad.matrix(), radialBrush.matrix()); + QCOMPARE(rGrad.transform(), radialBrush.transform()); QCOMPARE(rGrad.gradient()->type(), radialBrush.gradient()->type()); QCOMPARE(rGrad.gradient()->stops(), radialBrush.gradient()->stops()); QCOMPARE(rGrad.gradient()->spread(), radialBrush.gradient()->spread()); @@ -3307,7 +3403,7 @@ void tst_QDataStream::streamRealDataTypes() QCOMPARE(((QRadialGradient *)rGrad.gradient())->radius(), ((QRadialGradient *)radialBrush.gradient())->radius()); stream >> cGrad; QCOMPARE(cGrad.style(), conicalBrush.style()); - QCOMPARE(cGrad.matrix(), conicalBrush.matrix()); + QCOMPARE(cGrad.transform(), conicalBrush.transform()); QCOMPARE(cGrad.gradient()->type(), conicalBrush.gradient()->type()); QCOMPARE(cGrad.gradient()->stops(), conicalBrush.gradient()->stops()); QCOMPARE(cGrad.gradient()->spread(), conicalBrush.gradient()->spread()); @@ -3821,6 +3917,49 @@ void tst_QDataStream::nestedTransactionsResult() QCOMPARE(int(stream.status()), expectedStatus); } +using CustomPair = QPair<int, int>; +QDataStream &operator<<(QDataStream &ds, CustomPair pd) +{ return ds << pd.first << pd.second; } +QDataStream &operator>>(QDataStream &ds, CustomPair &pd) +{ return ds >> pd.first >> pd.second; } + + +void tst_QDataStream::typedefQt5Compat() +{ + qRegisterMetaType<CustomPair>("CustomPair"); + QByteArray qt5Data; + { + // we can read the qt5 version + QFile in(QFINDTESTDATA("typedef.q5")); + QVERIFY(in.open(QIODevice::ReadOnly)); + qt5Data = in.readAll(); + QVERIFY(in.seek(0)); + QDataStream stream(&in); + stream.setVersion(QDataStream::Qt_5_15); + QVariant var; + stream >> var; + QCOMPARE(stream.status(), QDataStream::Ok); + CustomPair p = var.value<CustomPair>(); + QCOMPARE(p.first, 42); + QCOMPARE(p.second, 100); + } + { + // writing in Qt 6 results in the same file + QTemporaryDir dir; + QVERIFY(dir.isValid()); + QFile file(dir.filePath(u"typedef.q6"_s)); + QVERIFY(file.open(QIODevice::WriteOnly)); + QDataStream stream(&file); + stream.setVersion(QDataStream::Qt_5_15); + CustomPair p {42, 100}; + stream << QVariant::fromValue(p); + file.close(); + QVERIFY(file.open(QIODevice::ReadOnly)); + QCOMPARE(file.readAll(), qt5Data); + } +} + QTEST_MAIN(tst_QDataStream) + #include "tst_qdatastream.moc" diff --git a/tests/auto/corelib/serialization/qdatastream/typedef.q5 b/tests/auto/corelib/serialization/qdatastream/typedef.q5 Binary files differnew file mode 100644 index 0000000000..c6b5e8a4df --- /dev/null +++ b/tests/auto/corelib/serialization/qdatastream/typedef.q5 |