summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp')
-rw-r--r--tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp114
1 files changed, 81 insertions, 33 deletions
diff --git a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp
index 4a0fc81a9c..96eb792cb2 100644
--- a/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/corelib/time/qdatetime/tst_qdatetime.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2020 The Qt Company Ltd.
+** Copyright (C) 2021 The Qt Company Ltd.
** Copyright (C) 2016 Intel Corporation.
** Contact: https://www.qt.io/licensing/
**
@@ -152,6 +152,7 @@ private slots:
void isDaylightTime() const;
void daylightTransitions() const;
void timeZones() const;
+ void systemTimeZoneChange_data() const;
void systemTimeZoneChange() const;
void invalid_data() const;
@@ -825,7 +826,7 @@ void tst_QDateTime::toString_isoDate_data()
QTest::newRow("negative non-integral OffsetFromUTC")
<< dt << Qt::ISODate
<< QString("1978-11-09T13:28:34-00:15");
- QTest::newRow("invalid")
+ QTest::newRow("invalid") // ISODate < 2019 doesn't allow -ve year numbers; QTBUG-91070
<< QDateTime(QDate(-1, 11, 9), QTime(13, 28, 34), Qt::UTC)
<< Qt::ISODate << QString();
QTest::newRow("without-ms")
@@ -838,30 +839,31 @@ void tst_QDateTime::toString_isoDate_data()
void tst_QDateTime::toString_isoDate()
{
- QFETCH(QDateTime, datetime);
- QFETCH(Qt::DateFormat, format);
- QFETCH(QString, expected);
+ QFETCH(const QDateTime, datetime);
+ QFETCH(const Qt::DateFormat, format);
+ QFETCH(const QString, expected);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
QLocale oldLocale;
QLocale::setDefault(QLocale("en_US"));
#endif // ### Qt 6: remove
- QString result = datetime.toString(format);
+ const QString result = datetime.toString(format);
QCOMPARE(result, expected);
- QDateTime resultDatetime = QDateTime::fromString(result, format);
- // If expecting invalid result the datetime may still be valid, i.e. year < 0 or > 9999
- if (!expected.isEmpty()) {
- QEXPECT_FAIL("without-ms", "Qt::ISODate truncates milliseconds (QTBUG-56552)", Abort);
-
- QCOMPARE(resultDatetime, datetime);
- QCOMPARE(resultDatetime.date(), datetime.date());
- QCOMPARE(resultDatetime.time(), datetime.time());
- QCOMPARE(resultDatetime.timeSpec(), datetime.timeSpec());
- QCOMPARE(resultDatetime.offsetFromUtc(), datetime.offsetFromUtc());
- } else {
+ const QDateTime resultDatetime = QDateTime::fromString(result, format);
+ if (QByteArray(QTest::currentDataTag()) == "invalid") {
QCOMPARE(resultDatetime, QDateTime());
+ } else {
+ const QDateTime when =
+ QByteArray(QTest::currentDataTag()) == "without-ms"
+ ? datetime.addMSecs(-datetime.time().msec()) : datetime;
+ QCOMPARE(resultDatetime.toMSecsSinceEpoch(), when.toMSecsSinceEpoch());
+ QCOMPARE(resultDatetime, when);
+ QCOMPARE(resultDatetime.date(), when.date());
+ QCOMPARE(resultDatetime.time(), when.time());
+ QCOMPARE(resultDatetime.timeSpec(), when.timeSpec());
+ QCOMPARE(resultDatetime.offsetFromUtc(), when.offsetFromUtc());
}
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
@@ -1039,7 +1041,10 @@ void tst_QDateTime::toString_enumformat()
QString str2 = dt1.toString(Qt::ISODate);
QCOMPARE(str2, QString("1995-05-20T12:34:56"));
+#if QT_DEPRECATED_SINCE(5, 15)
+ QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED
QString str3 = dt1.toString(Qt::LocalDate);
+ QT_WARNING_POP
QVERIFY(!str3.isEmpty());
//check for date/time components in any order
//year may be 2 or 4 digits
@@ -1048,6 +1053,7 @@ void tst_QDateTime::toString_enumformat()
QVERIFY(str3.contains("12"));
QVERIFY(str3.contains("34"));
//seconds may be absent
+#endif // 5.15 deprecations
}
void tst_QDateTime::addDays()
@@ -1096,6 +1102,18 @@ void tst_QDateTime::addDays()
QCOMPARE(dt2.timeSpec(), Qt::OffsetFromUTC);
QCOMPARE(dt2.offsetFromUtc(), 60 * 60);
+#if QT_CONFIG(timezone)
+ const QTimeZone cet("Europe/Oslo");
+ if (cet.isValid()) {
+ dt1 = QDate(2022, 1, 10).startOfDay(cet);
+ dt2 = dt1.addDays(2); // QTBUG-99668: should not assert
+ QCOMPARE(dt2.date(), QDate(2022, 1, 12));
+ QCOMPARE(dt2.time(), QTime(0, 0));
+ QCOMPARE(dt2.timeSpec(), Qt::TimeZone);
+ QCOMPARE(dt2.timeZone(), cet);
+ }
+#endif
+
// ### test invalid QDateTime()
}
@@ -2705,6 +2723,9 @@ void tst_QDateTime::fromStringStringFormat()
#endif
// OffsetFromUTC needs an offset check - we may as well do it for all:
QCOMPARE(dt.offsetFromUtc(), expected.offsetFromUtc());
+ } else {
+ QCOMPARE(dt.isValid(), expected.isValid());
+ QCOMPARE(dt.toMSecsSinceEpoch(), expected.toMSecsSinceEpoch());
}
}
@@ -3176,7 +3197,9 @@ void tst_QDateTime::daylightTransitions() const
QDateTime missing(QDate(2012, 3, 25), QTime(2, 0, 0));
QVERIFY(!missing.isValid());
QCOMPARE(missing.date(), QDate(2012, 3, 25));
- QCOMPARE(missing.time(), QTime(2, 0, 0));
+ QCOMPARE(missing.time(), QTime(2, 0));
+ // datetimeparser relies on toMSecsSinceEpoch to still work:
+ QCOMPARE(missing.toMSecsSinceEpoch(), daylight2012);
QDateTime after(QDate(2012, 3, 25), QTime(3, 0, 0));
QVERIFY(after.isValid());
@@ -3546,7 +3569,7 @@ void tst_QDateTime::timeZones() const
QCOMPARE(nzStdOffset.date(), QDate(2012, 6, 1));
QCOMPARE(nzStdOffset.time(), QTime(12, 0, 0));
QVERIFY(nzStdOffset.timeZone() == nzTzOffset);
- QCOMPARE(nzStdOffset.timeZone().id(), QByteArray("UTC+12:00"));
+ QCOMPARE(nzStdOffset.timeZone().id(), QByteArray("UTC+12"));
QCOMPARE(nzStdOffset.offsetFromUtc(), 43200);
QCOMPARE(nzStdOffset.isDaylightTime(), false);
QCOMPARE(nzStdOffset.toMSecsSinceEpoch(), utcStd.toMSecsSinceEpoch());
@@ -3716,38 +3739,63 @@ void tst_QDateTime::timeZones() const
#endif
}
-void tst_QDateTime::systemTimeZoneChange() const
+void tst_QDateTime::systemTimeZoneChange_data() const
{
#ifdef Q_OS_WINRT
QSKIP("UWP applications cannot change the system`s time zone (sandboxing)");
#endif
- // Set the timezone to Brisbane time
- TimeZoneRollback useZone(QByteArray("AEST-10:00"));
+ QTest::addColumn<QDate>("date");
+ QTest::newRow("short") << QDate(1970, 1, 1);
+ QTest::newRow("2012") << QDate(2012, 6, 1); // short on 64-bit, pimpled on 32-bit
+ QTest::newRow("pimpled") << QDate(1150000, 6, 1);
+}
- QDateTime localDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::LocalTime);
- QDateTime utcDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::UTC);
+void tst_QDateTime::systemTimeZoneChange() const
+{
+ QFETCH(const QDate, date);
+ const QTime early(2, 15, 30);
+
+ // Start out in Brisbane time:
+ TimeZoneRollback useZone(QByteArray("AEST-10:00"));
+ if (QDateTime(date, early, Qt::LocalTime).offsetFromUtc() != 600 * 60)
+ QSKIP("Test depends on system support for changing zone to AEST-10:00");
#if QT_CONFIG(timezone)
- QDateTime tzDate = QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), QTimeZone("Australia/Brisbane"));
+ QVERIFY(QTimeZone::systemTimeZone().isValid());
#endif
- qint64 localMsecs = localDate.toMSecsSinceEpoch();
- qint64 utcMsecs = utcDate.toMSecsSinceEpoch();
+
+ const QDateTime localDate = QDateTime(date, early, Qt::LocalTime);
+ const QDateTime utcDate = QDateTime(date, early, Qt::UTC);
+ const qint64 localMsecs = localDate.toMSecsSinceEpoch();
+ const qint64 utcMsecs = utcDate.toMSecsSinceEpoch();
#if QT_CONFIG(timezone)
- qint64 tzMsecs = tzDate.toMSecsSinceEpoch();
+ const QTimeZone aest("Australia/Brisbane"); // no transitions since 1992
+ // Check that Australia/Brisbane is known:
+ QVERIFY(aest.isValid());
+ const QDateTime tzDate = QDateTime(date, early, aest);
- // check that Australia/Brisbane is known
+ // Check we got the right zone !
QVERIFY(tzDate.timeZone().isValid());
+ QCOMPARE(tzDate.timeZone(), aest);
+ const qint64 tzMsecs = tzDate.toMSecsSinceEpoch();
#endif
// Change to Indian time
useZone.reset(QByteArray("IST-05:30"));
+ if (QDateTime(date, early, Qt::LocalTime).offsetFromUtc() != 330 * 60)
+ QSKIP("Test depends on system support for changing zone to IST-05:30");
+#if QT_CONFIG(timezone)
+ QVERIFY(QTimeZone::systemTimeZone().isValid());
+#endif
- QCOMPARE(localDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::LocalTime));
- QVERIFY(localMsecs != localDate.toMSecsSinceEpoch());
- QCOMPARE(utcDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), Qt::UTC));
+ QCOMPARE(localDate, QDateTime(date, early, Qt::LocalTime));
+ // Note: localDate.toMSecsSinceEpoch == localMsecs, unchanged, iff localDate is pimpled.
+ QVERIFY(localMsecs != QDateTime(date, early, Qt::LocalTime).toMSecsSinceEpoch());
+ QCOMPARE(utcDate, QDateTime(date, early, Qt::UTC));
QCOMPARE(utcDate.toMSecsSinceEpoch(), utcMsecs);
#if QT_CONFIG(timezone)
- QCOMPARE(tzDate, QDateTime(QDate(2012, 6, 1), QTime(2, 15, 30), QTimeZone("Australia/Brisbane")));
QCOMPARE(tzDate.toMSecsSinceEpoch(), tzMsecs);
+ QCOMPARE(tzDate.timeZone(), aest);
+ QCOMPARE(tzDate, QDateTime(date, early, aest));
#endif
}