Rework tst_QDate{,Time} QDataStream test to include all versions

In tst_QDate the test previously had a hard-coded list of versions by
name. This, however, needed updates on each new release (or at least
new version of QDS), which have been neglected since Qt 5.0. The
tst_QDateTime version, meanwhile, only identified versions by their
numeric value, not their symbolic names.

So borrow the way tst_QCalendar enumerates QCalendar::System, making
QDataStream a Q_GADGET and its Version a Q_ENUM to support this, to
iterate over all versions algorithmically. Apply to both data stream
tests to get a more consistent form for their data tags.

Change-Id: I04d1060cfec822cfcdc0bce6d15b636fc165fe36
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
Edward Welbourne 2025-05-23 18:12:08 +02:00
parent 3905d3c4df
commit dd5f409c58
3 changed files with 29 additions and 38 deletions

View File

@ -4,6 +4,7 @@
#ifndef QDATASTREAM_H
#define QDATASTREAM_H
#include <QtCore/qobjectdefs.h>
#include <QtCore/qchar.h>
#include <QtCore/qcontainerfwd.h>
#include <QtCore/qiodevicebase.h>
@ -46,6 +47,8 @@ QDataStream &writeAssociativeMultiContainer(QDataStream &s, const Container &c);
}
class Q_CORE_EXPORT QDataStream : public QIODeviceBase
{
Q_GADGET
public:
enum Version QT7_ONLY(: quint8) {
Qt_1_0 = 1,
@ -97,6 +100,7 @@ public:
#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
#endif
};
Q_ENUM(Version)
enum ByteOrder {
BigEndian = QSysInfo::BigEndian,

View File

@ -1161,38 +1161,23 @@ void tst_QDate::operator_insert_extract_data()
QTest::addColumn<QDate>("date");
QTest::addColumn<QDataStream::Version>("dataStreamVersion");
QMap<QDataStream::Version, QByteArray> versionsToTest;
versionsToTest.insert(QDataStream::Qt_1_0, "Qt_1_0"_ba);
versionsToTest.insert(QDataStream::Qt_2_0, "Qt_2_0"_ba);
versionsToTest.insert(QDataStream::Qt_2_1, "Qt_2_1"_ba);
versionsToTest.insert(QDataStream::Qt_3_0, "Qt_3_0"_ba);
versionsToTest.insert(QDataStream::Qt_3_1, "Qt_3_1"_ba);
versionsToTest.insert(QDataStream::Qt_3_3, "Qt_3_3"_ba);
versionsToTest.insert(QDataStream::Qt_4_0, "Qt_4_0"_ba);
versionsToTest.insert(QDataStream::Qt_4_1, "Qt_4_1"_ba);
versionsToTest.insert(QDataStream::Qt_4_2, "Qt_4_2"_ba);
versionsToTest.insert(QDataStream::Qt_4_3, "Qt_4_3"_ba);
versionsToTest.insert(QDataStream::Qt_4_4, "Qt_4_4"_ba);
versionsToTest.insert(QDataStream::Qt_4_5, "Qt_4_5"_ba);
versionsToTest.insert(QDataStream::Qt_4_6, "Qt_4_6"_ba);
versionsToTest.insert(QDataStream::Qt_4_7, "Qt_4_7"_ba);
versionsToTest.insert(QDataStream::Qt_4_8, "Qt_4_8"_ba);
versionsToTest.insert(QDataStream::Qt_4_9, "Qt_4_9"_ba);
versionsToTest.insert(QDataStream::Qt_5_0, "Qt_5_0"_ba);
for (auto it = versionsToTest.constBegin(); it != versionsToTest.constEnd(); ++it) {
const QByteArray &version(it.value());
const char *const tag = version.constData();
QTest::addRow("(invalid) %s", tag) << invalidDate() << it.key();
QTest::addRow("(1, 1, 1) %s", tag) << QDate(1, 1, 1) << it.key();
QTest::addRow("(-1, 1, 1) %s", tag) << QDate(-1, 1, 1) << it.key();
QTest::addRow("(1995, 5, 20) %s", tag) << QDate(1995, 5, 20) << it.key();
const QMetaEnum e = QMetaEnum::fromType<QDataStream::Version>();
for (int version = QDataStream::Qt_1_0; version <= QDataStream::Qt_DefaultCompiledVersion;
++version) {
if (e.value(version) == -1 || qstrcmp(e.key(version), "Qt_DefaultCompiledVersion") == 0)
continue;
const auto dataStreamVersion = static_cast<QDataStream::Version>(version);
const char *const tag = e.key(version);
QTest::addRow("(invalid) %s", tag) << invalidDate() << dataStreamVersion;
QTest::addRow("(1, 1, 1) %s", tag) << QDate(1, 1, 1) << dataStreamVersion;
QTest::addRow("(-1, 1, 1) %s", tag) << QDate(-1, 1, 1) << dataStreamVersion;
QTest::addRow("(1995, 5, 20) %s", tag) << QDate(1995, 5, 20) << dataStreamVersion;
// Test minimums for quint32/qint64.
if (it.key() >= QDataStream::Qt_5_0)
QTest::addRow("(-4714, 11, 24) %s", tag) << QDate(-4714, 11, 24) << it.key();
if (dataStreamVersion >= QDataStream::Qt_5_0)
QTest::addRow("(-4714, 11, 24) %s", tag) << QDate(-4714, 11, 24) << dataStreamVersion;
else
QTest::addRow("(-4713, 1, 2) %s", tag) << QDate(-4713, 1, 2) << it.key();
QTest::addRow("(-4713, 1, 2) %s", tag) << QDate(-4713, 1, 2) << dataStreamVersion;
}
}

View File

@ -2631,18 +2631,20 @@ void tst_QDateTime::operator_insert_extract_data()
const QByteArray westernAustralia("AWST-8AWDT-9,M10.5.0,M3.5.0/03:00:00");
const QByteArray hawaii("HAW10");
const QDataStream tmpDataStream;
const int thisVersion = tmpDataStream.version();
for (int version = QDataStream::Qt_1_0; version <= thisVersion; ++version) {
const QDataStream::Version dataStreamVersion = static_cast<QDataStream::Version>(version);
const QByteArray vN = QByteArray::number(dataStreamVersion);
QTest::addRow("v%d WA => HAWAII %d", version, 2012)
const QMetaEnum e = QMetaEnum::fromType<QDataStream::Version>();
for (int version = QDataStream::Qt_1_0; version <= QDataStream::Qt_DefaultCompiledVersion;
++version) {
if (e.value(version) == -1 || qstrcmp(e.key(version), "Qt_DefaultCompiledVersion") == 0)
continue;
const auto dataStreamVersion = static_cast<QDataStream::Version>(version);
const char *const tag = e.key(version);
QTest::addRow("%s WA => HAWAII %d", tag, 2012)
<< 2012 << westernAustralia << hawaii << dataStreamVersion;
QTest::addRow("v%d WA => WA %d", version, 2012)
QTest::addRow("%s WA => WA %d", tag, 2012)
<< 2012 << westernAustralia << westernAustralia << dataStreamVersion;
QTest::addRow("v%d HAWAII => WA %d", version, -2012)
QTest::addRow("%s HAWAII => WA %d", tag, -2012)
<< -2012 << hawaii << westernAustralia << dataStreamVersion;
QTest::addRow("v%d HAWAII => HAWAII %d", version, 2012)
QTest::addRow("%s HAWAII => HAWAII %d", tag, 2012)
<< 2012 << hawaii << hawaii << dataStreamVersion;
}
}