diff options
-rw-r--r-- | src/corelib/kernel/qvariant.cpp | 7 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qguivariant/test/data/qpolygonf.bin | bin | 0 -> 103 bytes | |||
-rw-r--r-- | tests/auto/gui/kernel/qguivariant/test/qguivariant.qrc | 5 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qguivariant/test/test.pro | 1 | ||||
-rw-r--r-- | tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp | 42 |
5 files changed, 54 insertions, 1 deletions
diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 20e13a050f..5754af42ac 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -1892,6 +1892,7 @@ void QVariant::load(QDataStream &s) void QVariant::save(QDataStream &s) const { quint32 typeId = type(); + bool fakeUserType = false; if (s.version() < QDataStream::Qt_4_0) { int i; for (i = 0; i <= MapFromThreeCount - 1; ++i) { @@ -1916,12 +1917,16 @@ void QVariant::save(QDataStream &s) const } else if (typeId >= QMetaType::QKeySequence && typeId <= QMetaType::QQuaternion) { // and as a result these types received lower ids too typeId +=1; + } else if (typeId == QMetaType::QPolygonF) { + // This existed in Qt 4 only as a custom type + typeId = 127; + fakeUserType = true; } } s << typeId; if (s.version() >= QDataStream::Qt_4_2) s << qint8(d.is_null); - if (d.type >= QVariant::UserType) { + if (d.type >= QVariant::UserType || fakeUserType) { s << QMetaType::typeName(userType()); } diff --git a/tests/auto/gui/kernel/qguivariant/test/data/qpolygonf.bin b/tests/auto/gui/kernel/qguivariant/test/data/qpolygonf.bin Binary files differnew file mode 100644 index 0000000000..02e749b83f --- /dev/null +++ b/tests/auto/gui/kernel/qguivariant/test/data/qpolygonf.bin diff --git a/tests/auto/gui/kernel/qguivariant/test/qguivariant.qrc b/tests/auto/gui/kernel/qguivariant/test/qguivariant.qrc new file mode 100644 index 0000000000..576d9cda1c --- /dev/null +++ b/tests/auto/gui/kernel/qguivariant/test/qguivariant.qrc @@ -0,0 +1,5 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>data</file> +</qresource> +</RCC> diff --git a/tests/auto/gui/kernel/qguivariant/test/test.pro b/tests/auto/gui/kernel/qguivariant/test/test.pro index d47cf7bf6f..e3b4a350ca 100644 --- a/tests/auto/gui/kernel/qguivariant/test/test.pro +++ b/tests/auto/gui/kernel/qguivariant/test/test.pro @@ -4,3 +4,4 @@ TARGET = tst_qguivariant SOURCES += tst_qguivariant.cpp INCLUDEPATH += $$PWD/../../../../other/qvariant_common QT += testlib +RESOURCES += qguivariant.qrc diff --git a/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp b/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp index 6fdf3dc843..8a68f40f3f 100644 --- a/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp +++ b/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp @@ -114,6 +114,7 @@ private slots: void writeToReadFromDataStream_data(); void writeToReadFromDataStream(); + void writeToReadFromOldDataStream(); void colorInteger(); void invalidQColor(); @@ -525,6 +526,7 @@ void tst_QGuiVariant::writeToReadFromDataStream_data() QTest::newRow( "pointarray_valid" ) << QVariant::fromValue( QPolygon( QRect( 10, 10, 20, 20 ) ) ) << false; QTest::newRow( "region_invalid" ) << QVariant::fromValue( QRegion() ) << true; QTest::newRow( "region_valid" ) << QVariant::fromValue( QRegion( 10, 10, 20, 20 ) ) << false; + QTest::newRow("polygonf_valid") << QVariant::fromValue(QPolygonF(QRectF(10, 10, 20, 20))) << false; } void tst_QGuiVariant::invalidQColor() @@ -609,6 +611,46 @@ void tst_QGuiVariant::writeToReadFromDataStream() } } +void tst_QGuiVariant::writeToReadFromOldDataStream() +{ + QPolygonF polyF(QRectF(10, 10, 50, 50)); + QVariant testVariant(polyF); + { + // Read into a variant and compare + QFile file(":/data/qpolygonf.bin"); + QVERIFY(file.open(QIODevice::ReadOnly)); + QDataStream dataFileStream(&file); + dataFileStream.setVersion(QDataStream::Qt_4_9); + QVariant readVariant; + dataFileStream >> readVariant; + QVERIFY(readVariant.type() == QMetaType::QPolygonF); + QCOMPARE(testVariant, readVariant); + file.close(); + } + { + QByteArray variantData; + { + QDataStream varDataStream(&variantData, QIODevice::WriteOnly); + varDataStream << testVariant; + } + // Read into a bytearray and compare + QFile file(":/data/qpolygonf.bin"); + QVERIFY(file.open(QIODevice::ReadOnly)); + QDataStream dataFileStream(&file); + dataFileStream.setVersion(QDataStream::Qt_4_9); + int dummy; + dataFileStream >> dummy; + QByteArray polyData49; + dataFileStream >> polyData49; + file.close(); + QByteArray polyData50; + QDataStream readVarData(variantData); + readVarData >> dummy; + readVarData >> polyData50; + QVERIFY(polyData49 == polyData50); + } +} + void tst_QGuiVariant::debugStream_data() { QTest::addColumn<QVariant>("variant"); |