diff options
author | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2022-04-02 02:20:52 +0200 |
---|---|---|
committer | Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> | 2022-04-12 20:26:55 +0200 |
commit | 69555b364d5f398dec2e66c1f969cf3bfdc44057 (patch) | |
tree | 78780d0e75315a84a0c1a1aa794950f7f4b36fea /tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp | |
parent | 21ceefacdfbab381d416aa1dc894c60595ee6b88 (diff) |
QTimeZone: add construction from std::chrono::time_zone*
A time_zone represents a timezone identified by its IANA ID. This
allows for a straightforward conversion to QTimeZone.
[ChangeLog][QtCore][QTimeZone] QTimeZone can now be constructed
from a std::chrono::time_zone pointer.
Change-Id: I093d9fc2e989475d30730a9dcdef491903a2aeb2
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp')
-rw-r--r-- | tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp index 0a18958fb6..378c0d619d 100644 --- a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp +++ b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp @@ -77,6 +77,8 @@ private Q_SLOTS: void winTest(); void localeSpecificDisplayName_data(); void localeSpecificDisplayName(); + void stdCompatibility_data(); + void stdCompatibility(); private: void printTimeZone(const QTimeZone &tz); @@ -341,6 +343,11 @@ void tst_QTimeZone::systemZone() }; for (const auto &date : dates) QCOMPARE(date.startOfDay(Qt::LocalTime), date.startOfDay(zone)); + +#if __cpp_lib_chrono >= 201907L + const std::chrono::time_zone *currentTimeZone = std::chrono::current_zone(); + QCOMPARE(QByteArrayView(currentTimeZone->name()), QByteArrayView(zone.id())); +#endif } void tst_QTimeZone::dataStreamTest() @@ -1609,5 +1616,46 @@ void tst_QTimeZone::testEpochTranPrivate(const QTimeZonePrivate &tzp) } #endif // QT_BUILD_INTERNAL +#if __cpp_lib_chrono >= 201907L +Q_DECLARE_METATYPE(const std::chrono::time_zone *); +#endif + +void tst_QTimeZone::stdCompatibility_data() +{ +#if __cpp_lib_chrono >= 201907L + QTest::addColumn<const std::chrono::time_zone *>("timeZone"); + const std::chrono::tzdb &tzdb = std::chrono::get_tzdb(); + qDebug() << "Using tzdb version:" << QByteArrayView(tzdb.version); + + for (const std::chrono::time_zone &zone : tzdb.zones) + QTest::addRow(zone.name().data()) << &zone; +#else + QSKIP("This test requires C++20's <chrono>."); +#endif +} + +void tst_QTimeZone::stdCompatibility() +{ +#if __cpp_lib_chrono >= 201907L + QFETCH(const std::chrono::time_zone *, timeZone); + QByteArrayView zoneName = QByteArrayView(timeZone->name()); + QTimeZone tz = QTimeZone::fromStdTimeZonePtr(timeZone); + if (tz.isValid()) { + QCOMPARE(tz.id(), zoneName); + } else { + // QTBUG-102187: a few timezones reported by tzdb might not be + // recognized by QTimeZone. This happens for instance on Windows, where + // tzdb is using ICU, whose database does not match QTimeZone's. + const bool isKnownUnknown = + !zoneName.contains('/') + || zoneName == "Antarctica/Troll" + || zoneName.startsWith("SystemV/"); + QVERIFY(isKnownUnknown); + } +#else + QSKIP("This test requires C++20's <chrono>."); +#endif +} + QTEST_APPLESS_MAIN(tst_QTimeZone) #include "tst_qtimezone.moc" |