summaryrefslogtreecommitdiffstats
path: root/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp')
-rw-r--r--tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp100
1 files changed, 77 insertions, 23 deletions
diff --git a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp
index a350ffeb04..e71f32a3ca 100644
--- a/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp
+++ b/tests/auto/corelib/time/qtimezone/tst_qtimezone.cpp
@@ -7,6 +7,7 @@
#include <private/qcomparisontesthelper_p.h>
#include <qlocale.h>
+#include <qscopeguard.h>
#if defined(Q_OS_WIN)
#include <QOperatingSystemVersion>
@@ -16,6 +17,8 @@
# define USING_WIN_TZ
#endif
+using namespace Qt::StringLiterals;
+
class tst_QTimeZone : public QObject
{
Q_OBJECT
@@ -38,6 +41,8 @@ private Q_SLOTS:
void availableTimeZoneIds();
void utcOffsetId_data();
void utcOffsetId();
+ void aliasMatches_data();
+ void aliasMatches();
void specificTransition_data();
void specificTransition();
void transitionEachZone_data();
@@ -558,9 +563,12 @@ void tst_QTimeZone::isTimeZoneIdAvailable()
const QList<QByteArray> available = QTimeZone::availableTimeZoneIds();
for (const QByteArray &id : available) {
QVERIFY2(QTimeZone::isTimeZoneIdAvailable(id), id);
- QVERIFY2(QTimeZone(id).isValid(), id);
- QCOMPARE(QTimeZone(id).id(), id);
+ const QTimeZone zone(id);
+ QVERIFY2(zone.isValid(), id);
+ QVERIFY2(zone.aliasMatches(id), zone.id() + " != " + id);
}
+ // availableTimeZoneIds() doesn't list all possible offset IDs, but
+ // isTimeZoneIdAvailable() should accept them.
for (qint32 offset = QTimeZone::MinUtcOffsetSecs;
offset <= QTimeZone::MinUtcOffsetSecs; ++offset) {
const QByteArray id = QTimeZone(offset).id();
@@ -584,7 +592,7 @@ void tst_QTimeZone::utcOffsetId_data()
#define ROW(name, valid, offset) \
QTest::newRow(name) << QByteArray(name) << valid << offset
- // See qtbase/util/locale_database/cldr2qtimezone.py for source
+ // See qtbase/util/locale_database/zonedata.py for source
// CLDR v35.1 IDs:
ROW("UTC", true, 0);
ROW("UTC-14:00", true, -50400);
@@ -700,6 +708,58 @@ void tst_QTimeZone::utcOffsetId()
}
}
+void tst_QTimeZone::aliasMatches_data()
+{
+ QTest::addColumn<QByteArray>("iana");
+ QTest::addColumn<QByteArray>("alias");
+
+ QTest::newRow("Montreal=Toronto") << "America/Toronto"_ba << "America/Montreal"_ba;
+ QTest::newRow("Asmera=Asmara") << "Africa/Asmara"_ba << "Africa/Asmera"_ba;
+ QTest::newRow("Argentina/Catamarca")
+ << "America/Argentina/Catamarca"_ba << "America/Catamarca"_ba;
+ QTest::newRow("Godthab=Nuuk") << "America/Nuuk"_ba << "America/Godthab"_ba;
+ QTest::newRow("Indiana/Indianapolis")
+ << "America/Indiana/Indianapolis"_ba << "America/Indianapolis"_ba;
+ QTest::newRow("Kentucky/Louisville")
+ << "America/Kentucky/Louisville"_ba << "America/Louisville"_ba;
+ QTest::newRow("Calcutta=Kolkata") << "Asia/Kolkata"_ba << "Asia/Calcutta"_ba;
+ QTest::newRow("Katmandu=Kathmandu") << "Asia/Kathmandu"_ba << "Asia/Katmandu"_ba;
+ QTest::newRow("Rangoon=Yangon") << "Asia/Yangon"_ba << "Asia/Rangoon"_ba;
+ QTest::newRow("Saigon=Ho_Chi_Minh") << "Asia/Ho_Chi_Minh"_ba << "Asia/Saigon"_ba;
+ QTest::newRow("Faeroe=Faroe") << "Atlantic/Faroe"_ba << "Atlantic/Faeroe"_ba;
+ QTest::newRow("Currie=Hobart") << "Australia/Hobart"_ba << "Australia/Currie"_ba;
+ QTest::newRow("Kiev=Kyiv") << "Europe/Kyiv"_ba << "Europe/Kiev"_ba;
+ QTest::newRow("Uzhgorod=Kyiv") << "Europe/Kyiv"_ba << "Europe/Uzhgorod"_ba;
+ QTest::newRow("Zaporozhye=Kyiv") << "Europe/Kyiv"_ba << "Europe/Zaporozhye"_ba;
+ QTest::newRow("Fiji=Fiji") << "Pacific/Fiji"_ba << "Pacific/Fiji"_ba;
+ QTest::newRow("Enderbury=Enderbury") << "Pacific/Enderbury"_ba << "Pacific/Enderbury"_ba;
+}
+
+void tst_QTimeZone::aliasMatches()
+{
+ QFETCH(const QByteArray, iana);
+ QFETCH(const QByteArray, alias);
+ const QTimeZone zone(iana);
+ const QTimeZone peer(alias);
+ if (!zone.isValid())
+ QSKIP("Backend doesn't support IANA ID");
+
+ auto report = qScopeGuard([zone, peer]() {
+ const QByteArray zid = zone.id(), pid = peer.id();
+ qDebug("Using %s and %s", zid.constData(), pid.constData());
+ });
+ QVERIFY2(peer.isValid(), "Construction should have fallen back on IANA ID");
+ QVERIFY(zone.aliasMatches(zone.id()));
+ QVERIFY(zone.aliasMatches(iana));
+ QVERIFY(peer.aliasMatches(peer.id()));
+ QVERIFY(peer.aliasMatches(alias));
+ QVERIFY(zone.aliasMatches(peer.id()));
+ QVERIFY(zone.aliasMatches(alias));
+ QVERIFY(peer.aliasMatches(zone.id()));
+ QVERIFY(peer.aliasMatches(iana));
+ report.dismiss();
+}
+
void tst_QTimeZone::specificTransition_data()
{
QTest::addColumn<QByteArray>("zone");
@@ -924,7 +984,7 @@ void tst_QTimeZone::stressTest()
for (const QByteArray &id : idList) {
QTimeZone testZone = QTimeZone(id);
QCOMPARE(testZone.isValid(), true);
- QCOMPARE(testZone.id(), id);
+ QVERIFY2(testZone.aliasMatches(id), testZone.id() + " != " + id);
QDateTime testDate = QDateTime(QDate(2015, 1, 1), QTime(0, 0), UTC);
testZone.territory();
testZone.comment();
@@ -972,7 +1032,7 @@ void tst_QTimeZone::windowsId()
Current Windows zones for "Central Standard Time":
Region IANA Id(s)
Default "America/Chicago"
- Canada "America/Winnipeg America/Rainy_River America/Rankin_Inlet America/Resolute"
+ Canada "America/Winnipeg America/Rankin_Inlet America/Resolute"
Mexico "America/Matamoros"
USA "America/Chicago America/Indiana/Knox America/Indiana/Tell_City America/Menominee"
"America/North_Dakota/Beulah America/North_Dakota/Center"
@@ -1004,8 +1064,8 @@ void tst_QTimeZone::windowsId()
"America/Chicago", "America/Indiana/Knox", "America/Indiana/Tell_City",
"America/Matamoros", "America/Menominee", "America/North_Dakota/Beulah",
"America/North_Dakota/Center", "America/North_Dakota/New_Salem",
- "America/Ojinaga", "America/Rainy_River", "America/Rankin_Inlet",
- "America/Resolute", "America/Winnipeg", "CST6CDT"
+ "America/Ojinaga", "America/Rankin_Inlet", "America/Resolute",
+ "America/Winnipeg", "CST6CDT"
};
QCOMPARE(QTimeZone::windowsIdToIanaIds("Central Standard Time"), list);
}
@@ -1018,7 +1078,7 @@ void tst_QTimeZone::windowsId()
{
// Check valid country returns list in preference order
const QList<QByteArray> list = {
- "America/Winnipeg", "America/Rainy_River", "America/Rankin_Inlet", "America/Resolute"
+ "America/Winnipeg", "America/Rankin_Inlet", "America/Resolute"
};
QCOMPARE(QTimeZone::windowsIdToIanaIds("Central Standard Time", QLocale::Canada), list);
}
@@ -1280,7 +1340,7 @@ void tst_QTimeZone::utcTest()
void tst_QTimeZone::icuTest()
{
-#if defined(QT_BUILD_INTERNAL) && QT_CONFIG(icu)
+#if defined(QT_BUILD_INTERNAL) && QT_CONFIG(icu) && !defined(Q_OS_UNIX)
// Known datetimes
qint64 std = QDateTime(QDate(2012, 1, 1), QTime(0, 0), QTimeZone::UTC).toMSecsSinceEpoch();
qint64 dst = QDateTime(QDate(2012, 6, 1), QTime(0, 0), QTimeZone::UTC).toMSecsSinceEpoch();
@@ -1323,7 +1383,7 @@ void tst_QTimeZone::icuTest()
if (QTest::currentTestFailed())
return;
testEpochTranPrivate(QIcuTimeZonePrivate("America/Toronto"));
-#endif // icu
+#endif // ICU not on Unix
}
void tst_QTimeZone::tzTest()
@@ -1527,7 +1587,7 @@ void tst_QTimeZone::tzTest()
QDateTime dt(QDate(2016, 3, 28), QTime(0, 0), UTC);
QCOMPARE(tzBarnaul.data(dt.toMSecsSinceEpoch()).abbreviation, QString("+07"));
}
-#endif // QT_BUILD_INTERNAL && Q_OS_UNIX && !Q_OS_DARWIN
+#endif // QT_BUILD_INTERNAL && Q_OS_UNIX && !Q_OS_DARWIN && !Q_OS_ANDROID
}
void tst_QTimeZone::macTest()
@@ -1685,6 +1745,8 @@ void tst_QTimeZone::localeSpecificDisplayName()
QVERIFY(zone.isValid());
const QString localeName = zone.displayName(timeType, QTimeZone::LongName, locale);
+ if (localeName.isEmpty()) // Backend doesn't know how to localize this zone's name
+ QEXPECT_FAIL("", "QTBUG-115158 zone name localization unknown", Continue);
QCOMPARE(localeName, expectedName);
}
@@ -1857,18 +1919,10 @@ void tst_QTimeZone::stdCompatibility()
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);
- }
+ if (tz.isValid())
+ QVERIFY2(tz.aliasMatches(zoneName), tz.id().constData());
+ else
+ QVERIFY(!QTimeZone::isTimeZoneIdAvailable(zoneName.toByteArray()));
#else
QSKIP("This test requires C++20's <chrono>.");
#endif