From 4cce7dc19d0243d4d8f6f5f06365e251dbe1e7aa Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Mon, 30 Oct 2017 12:08:36 +0100 Subject: Test Russia's post-DST transitions are reported correctly This is a regression test for bugs resulting from failure to take account of the MS TZ APIs fake-DST handling of standard-time transitions happening during DST. Has to skip the 2014 test on Win7, as it's so old it doesn't know about the (for it) "future" transition. Task-number: QTBUG-42021 Change-Id: I853b86d03a86f0269371bf1622bf63882fb8ee5d Reviewed-by: Qt CI Bot Reviewed-by: Thiago Macieira --- .../auto/corelib/tools/qtimezone/tst_qtimezone.cpp | 62 ++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp') diff --git a/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp index 14dcd0babc..cb963ceeb6 100644 --- a/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp +++ b/tests/auto/corelib/tools/qtimezone/tst_qtimezone.cpp @@ -45,6 +45,8 @@ private slots: void dataStreamTest(); void isTimeZoneIdAvailable(); void availableTimeZoneIds(); + void specificTransition_data(); + void specificTransition(); void transitionEachZone_data(); void transitionEachZone(); void checkOffset_data(); @@ -398,6 +400,66 @@ void tst_QTimeZone::isTimeZoneIdAvailable() #endif // QT_BUILD_INTERNAL } +void tst_QTimeZone::specificTransition_data() +{ + QTest::addColumn("zone"); + QTest::addColumn("start"); + QTest::addColumn("stop"); + QTest::addColumn("count"); + QTest::addColumn("atUtc"); + // In minutes: + QTest::addColumn("offset"); + QTest::addColumn("stdoff"); + QTest::addColumn("dstoff"); + + // Moscow ditched DST on 2010-10-31 but has since changed standard offset twice. +#ifdef Q_OS_WIN + // Win7 is too old to know about this transition: + if (QOperatingSystemVersion::current() > QOperatingSystemVersion::Windows7) +#endif + { + QTest::newRow("Moscow/2014") // From original bug-report + << QByteArray("Europe/Moscow") + << QDate(2011, 4, 1) << QDate(2017, 12,31) << 1 + << QDateTime(QDate(2014, 10, 26), QTime(2, 0, 0), + Qt::OffsetFromUTC, 4 * 3600).toUTC() + << 3 * 3600 << 3 * 3600 << 0; + } + QTest::newRow("Moscow/2011") // Transition on 2011-03-27 + << QByteArray("Europe/Moscow") + << QDate(2010, 11, 1) << QDate(2014, 10, 25) << 1 + << QDateTime(QDate(2011, 3, 27), QTime(2, 0, 0), + Qt::OffsetFromUTC, 3 * 3600).toUTC() + << 4 * 3600 << 4 * 3600 << 0; +} + +void tst_QTimeZone::specificTransition() +{ + // Regression test for QTBUG-42021 (on MS-Win) + QFETCH(QByteArray, zone); + QFETCH(QDate, start); + QFETCH(QDate, stop); + QFETCH(int, count); + // No attempt to check abbreviations; to much cross-platform variation. + QFETCH(QDateTime, atUtc); + QFETCH(int, offset); + QFETCH(int, stdoff); + QFETCH(int, dstoff); + + QTimeZone timeZone(zone); + if (!timeZone.isValid()) + QSKIP("Missing time-zone data"); + QTimeZone::OffsetDataList transits = + timeZone.transitions(QDateTime(start, QTime(0, 0), timeZone), + QDateTime(stop, QTime(23, 59), timeZone)); + QCOMPARE(transits.length(), count); + const QTimeZone::OffsetData &transition = transits.at(0); + QCOMPARE(transition.offsetFromUtc, offset); + QCOMPARE(transition.standardTimeOffset, stdoff); + QCOMPARE(transition.daylightTimeOffset, dstoff); + QCOMPARE(transition.atUtc, atUtc); +} + void tst_QTimeZone::transitionEachZone_data() { QTest::addColumn("zone"); -- cgit v1.2.3