File indexing completed on 2024-04-21 14:55:16

0001 /*
0002  * This file is part of the KDE libraries.
0003  * Copyright 2009  Michael Leupold <lemma@confuego.org>
0004  *
0005  * This library is free software; you can redistribute it and/or
0006  * modify it under the terms of the GNU Lesser General Public
0007  * License as published by the Free Software Foundation; either
0008  * version 2.1 of the License, or (at your option) version 3, or any
0009  * later version accepted by the membership of KDE e.V. (or its
0010  * successor approved by the membership of KDE e.V.), which shall
0011  * act as a proxy defined in Section 6 of version 3 of the license.
0012  *
0013  * This library is distributed in the hope that it will be useful,
0014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0016  * Lesser General Public License for more details.
0017  *
0018  * You should have received a copy of the GNU Lesser General Public
0019  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
0020  */
0021 
0022 #include "klocaletimeformattest.h"
0023 
0024 #include <kconfig.h>
0025 #include <kconfiggroup.h>
0026 #include "kdayperiod_p.h"
0027 
0028 #include <QStandardPaths>
0029 #include <QStringList>
0030 #include <QTest>
0031 
0032 static QString loadTimeFormat(const QString &country)
0033 {
0034     const QString file = QStandardPaths::locate(QStandardPaths::GenericDataLocation,
0035                          QString::fromLatin1("kf5/locale/countries/%1/country.desktop")
0036                          .arg(country));
0037     if (file.isEmpty()) {
0038         return QString();
0039     }
0040     KConfig entryFile(file);
0041     KConfigGroup entry(&entryFile, "KCM Locale");
0042     return entry.readEntry("TimeFormat", QString());
0043 }
0044 
0045 void KLocaleTimeFormatTest::initTestCase()
0046 {
0047     // get countries with according time formats
0048     // for formatAndReadAllCountriesTest().
0049     QStringList countries(KLocale::global()->allCountriesList());
0050     QString timeFormat;
0051     Q_FOREACH (const QString &c, countries) {
0052         timeFormat = loadTimeFormat(c);
0053         if (!timeFormat.isEmpty()) {
0054             m_allFormats.insert(c, timeFormat);
0055         }
0056     }
0057 
0058     // additional test-data (for (format|read)TimeTest)
0059     m_timeFormats["ampm"].timeFormat = "%I:%M:%S %p";
0060     m_timeFormats["ampm"].exp[KLocale::TimeDefault] = "03:59:59 PM";
0061     m_timeFormats["ampm"].exp[KLocale::TimeWithoutAmPm] = "03:59:59";
0062     m_timeFormats["ampm"].exp[KLocale::TimeDuration] = "15:59:59";
0063     m_timeFormats["ampm"].exp[KLocale::TimeWithoutSeconds] = "03:59 PM";
0064     m_timeFormats["ampm"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm] = "03:59";
0065     m_timeFormats["ampm"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeDuration] = "15:59";
0066     m_timeFormats["ampm"].exp[KLocale::TimeFoldHours] = "959:59";
0067     m_timeFormats["ampm"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours] = "959";
0068 
0069     m_timeFormats["24h"].timeFormat = "%H:%M:%S";
0070     m_timeFormats["24h"].exp[KLocale::TimeDefault] = "15:59:59";
0071     m_timeFormats["24h"].exp[KLocale::TimeWithoutAmPm] = "15:59:59";
0072     m_timeFormats["24h"].exp[KLocale::TimeDuration] = "15:59:59";
0073     m_timeFormats["24h"].exp[KLocale::TimeWithoutSeconds] = "15:59";
0074     m_timeFormats["24h"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm] = "15:59";
0075     m_timeFormats["24h"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeDuration] = "15:59";
0076     m_timeFormats["24h"].exp[KLocale::TimeFoldHours] = "959:59";
0077     m_timeFormats["24h"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours] = "959";
0078 
0079     m_timeFormats["ampm2"].timeFormat = "%l:%M:%S %p";
0080     m_timeFormats["ampm2"].exp[KLocale::TimeDefault] = "3:59:59 PM";
0081     m_timeFormats["ampm2"].exp[KLocale::TimeWithoutAmPm] = "3:59:59";
0082     m_timeFormats["ampm2"].exp[KLocale::TimeDuration] = "15:59:59";
0083     m_timeFormats["ampm2"].exp[KLocale::TimeWithoutSeconds] = "3:59 PM";
0084     m_timeFormats["ampm2"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm] = "3:59";
0085     m_timeFormats["ampm2"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeDuration] = "15:59";
0086     m_timeFormats["ampm2"].exp[KLocale::TimeFoldHours] = "959:59";
0087     m_timeFormats["ampm2"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours] = "959";
0088 
0089     m_timeFormats["ag"].timeFormat = "%I.%M.%S.%p";
0090     m_timeFormats["ag"].exp[KLocale::TimeDefault] = "03.59.59.PM";
0091     m_timeFormats["ag"].exp[KLocale::TimeWithoutAmPm] = "03.59.59";
0092     m_timeFormats["ag"].exp[KLocale::TimeDuration] = "15.59.59";
0093     m_timeFormats["ag"].exp[KLocale::TimeWithoutSeconds] = "03.59.PM";
0094     m_timeFormats["ag"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm] = "03.59";
0095     m_timeFormats["ag"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeDuration] = "15.59";
0096     m_timeFormats["ag"].exp[KLocale::TimeFoldHours] = "959.59";
0097     m_timeFormats["ag"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours] = "959";
0098 
0099     m_timeFormats["ampre"].timeFormat = "%p %l-%M-%S";
0100     m_timeFormats["ampre"].exp[KLocale::TimeDefault] = "PM 3-59-59";
0101     m_timeFormats["ampre"].exp[KLocale::TimeWithoutAmPm] = "3-59-59";
0102     m_timeFormats["ampre"].exp[KLocale::TimeDuration] = "15-59-59";
0103     m_timeFormats["ampre"].exp[KLocale::TimeWithoutSeconds] = "PM 3-59";
0104     m_timeFormats["ampre"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm] = "3-59";
0105     m_timeFormats["ampre"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeDuration] = "15-59";
0106     m_timeFormats["ampre"].exp[KLocale::TimeFoldHours] = "959-59";
0107     m_timeFormats["ampre"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours] = "959";
0108 
0109     m_timeFormats["ampresep"].timeFormat = "%p-%l-%M-%S";
0110     m_timeFormats["ampresep"].exp[KLocale::TimeDefault] = "PM-3-59-59";
0111     m_timeFormats["ampresep"].exp[KLocale::TimeWithoutAmPm] = "3-59-59";
0112     m_timeFormats["ampresep"].exp[KLocale::TimeDuration] = "15-59-59";
0113     m_timeFormats["ampresep"].exp[KLocale::TimeWithoutSeconds] = "PM-3-59";
0114     m_timeFormats["ampresep"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm] = "3-59";
0115     m_timeFormats["ampresep"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeDuration] = "15-59";
0116     m_timeFormats["ampresep"].exp[KLocale::TimeFoldHours] = "959-59";
0117     m_timeFormats["ampresep"].exp[KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours] = "959";
0118 }
0119 
0120 void KLocaleTimeFormatTest::formatTimeTest()
0121 {
0122     KLocale locale(*KLocale::global());
0123     QTime time(15, 59, 59);
0124 
0125     QMap<QString, TimeFormatTestValue>::const_iterator it;
0126     QMap<QString, TimeFormatTestValue>::const_iterator end(m_timeFormats.constEnd());
0127     for (it = m_timeFormats.constBegin(); it != end; ++it) {
0128         locale.setTimeFormat(it.value().timeFormat);
0129 
0130         QMap<KLocale::TimeFormatOptions, QString>::const_iterator it2;
0131         QMap<KLocale::TimeFormatOptions, QString>::const_iterator end2(it.value().exp.constEnd());
0132         for (it2 = it.value().exp.constBegin(); it2 != end2; ++it2) {
0133             QCOMPARE(locale.formatLocaleTime(time, it2.key()), it2.value());
0134         }
0135     }
0136 }
0137 
0138 void KLocaleTimeFormatTest::readTimeTest()
0139 {
0140     KLocale locale(*KLocale::global());
0141     QMap<KLocale::TimeFormatOptions, QTime> timeMap;
0142     timeMap[KLocale::TimeDefault] = QTime(15, 59, 59);
0143     timeMap[KLocale::TimeWithoutSeconds] = QTime(15, 59, 0);
0144     timeMap[KLocale::TimeDuration] = QTime(15, 59, 59);
0145     timeMap[KLocale::TimeDuration | KLocale::TimeWithoutSeconds] = QTime(15, 59, 0);
0146     timeMap[KLocale::TimeWithoutAmPm] = QTime(3, 59, 59);
0147     timeMap[KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm] = QTime(3, 59, 0);
0148     timeMap[KLocale::TimeFoldHours] = QTime(15, 59, 59);
0149     timeMap[KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours] = QTime(15, 59);
0150 
0151     QMap<QString, TimeFormatTestValue>::const_iterator it;
0152     QMap<QString, TimeFormatTestValue>::const_iterator end(m_timeFormats.constEnd());
0153     for (it = m_timeFormats.constBegin(); it != end; ++it) {
0154         locale.setTimeFormat(it.value().timeFormat);
0155 
0156         bool ampm = locale.timeFormat().contains(QLatin1String("%p"));
0157 
0158         QMap<KLocale::TimeFormatOptions, QString>::const_iterator it2;
0159         QMap<KLocale::TimeFormatOptions, QString>::const_iterator end2(it.value().exp.constEnd());
0160         for (it2 = it.value().exp.constBegin(); it2 != end2; ++it2) {
0161             KLocale::TimeFormatOptions options = it2.key();
0162             if ((options & KLocale::TimeDuration) != KLocale::TimeDuration && !ampm) {
0163                 options &= ~KLocale::TimeWithoutAmPm;
0164             }
0165             if (!timeMap.contains(options)) {
0166                 QWARN("Missing entry in timeMap, skipping");
0167                 continue;
0168             }
0169             bool ok;
0170             QCOMPARE(locale.readLocaleTime(it2.value(), &ok, it2.key()), timeMap[options]);
0171             QVERIFY(ok);
0172         }
0173     }
0174 }
0175 
0176 void KLocaleTimeFormatTest::formatAndReadAllCountriesTest()
0177 {
0178     KLocale locale(*KLocale::global());
0179 
0180     // for each of the countries, format with any options, read again
0181     // and check if times match.
0182     QTime timeS(15, 59, 59);
0183     QTime timeNs(15, 59, 0);
0184     QTime timeAm(3, 59, 59);
0185     QTime timeNsAm(3, 59, 0);
0186 
0187     QMap<QString, QString>::const_iterator it(m_allFormats.constBegin());
0188     QMap<QString, QString>::const_iterator end(m_allFormats.constEnd());
0189     for (; it != end; ++it) {
0190         locale.setTimeFormat(it.value());
0191 
0192         bool ampm = locale.timeFormat().contains(QLatin1String("%p"));
0193 
0194         bool ok;
0195         QCOMPARE(locale.readLocaleTime(locale.formatLocaleTime(timeS, KLocale::TimeDefault), &ok, KLocale::TimeDefault), timeS);
0196         QVERIFY(ok);
0197         QCOMPARE(locale.readLocaleTime(locale.formatLocaleTime(timeS, KLocale::TimeWithoutAmPm), &ok, KLocale::TimeWithoutAmPm), ampm ? timeAm : timeS);
0198         QVERIFY(ok);
0199         QCOMPARE(locale.readLocaleTime(locale.formatLocaleTime(timeS, KLocale::TimeDuration), &ok, KLocale::TimeDuration), timeS);
0200         QVERIFY(ok);
0201 
0202         QCOMPARE(locale.readLocaleTime(locale.formatLocaleTime(timeS, KLocale::TimeWithoutSeconds), &ok, KLocale::TimeWithoutSeconds), timeNs);
0203         QVERIFY(ok);
0204         QCOMPARE(locale.readLocaleTime(locale.formatLocaleTime(timeS, KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm), &ok, KLocale::TimeWithoutSeconds | KLocale::TimeWithoutAmPm), ampm ? timeNsAm : timeNs);
0205         QVERIFY(ok);
0206         QCOMPARE(locale.readLocaleTime(locale.formatLocaleTime(timeS, KLocale::TimeWithoutSeconds | KLocale::TimeDuration), &ok, KLocale::TimeWithoutSeconds | KLocale::TimeDuration), timeNs);
0207         QVERIFY(ok);
0208         QCOMPARE(locale.readLocaleTime(locale.formatLocaleTime(timeS, KLocale::TimeFoldHours), &ok, KLocale::TimeFoldHours), timeS);
0209         QVERIFY(ok);
0210         QCOMPARE(locale.readLocaleTime(locale.formatLocaleTime(timeS, KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours), &ok, KLocale::TimeWithoutSeconds | KLocale::TimeFoldHours), timeNs);
0211     }
0212 }
0213 
0214 QTEST_MAIN(KLocaleTimeFormatTest)
0215 
0216 #include "moc_klocaletimeformattest.cpp"